Linux Sed 教程:Sed 保持和模式缓冲区操作的 7 个示例
【摘要】 在这篇文章中,让我们通过7 个实际的 sed 示例来了解如何使用 sed 保持和模式缓冲区。
在这篇文章中,让我们通过7 个实际的 sed 示例来了解如何使用 sed 保持和模式缓冲区。
顾名思义,sed 保持缓冲区用于保存全部或部分sed 模式空间,以供后续检索。模式空间的内容可以复制到保持空间,然后再复制回来。不直接对保持空间执行任何操作。sed 提供了一组保持和获取函数来处理这些动作。
sed h 函数
h(保持)函数将模式空间的内容复制到保持区域(也称为sed 保持空间),从而破坏保持区域的任何先前内容。
Sed H 函数
H 函数将模式空间的内容附加到保持区的内容中。以前的内容和新的内容由换行符分隔。
sed g 函数
g 函数将保存区的内容复制到模式空间,破坏模式空间之前的内容。
Sed G 函数
G 函数将保持区的内容附加到模式空间的内容中。以前的内容和新的内容由换行符分隔。地址的最大数量是两个。
sed x 函数
交换功能交换模式空间和保持区域的内容。地址的最大数量是两个。
现在让我们看一些例子来了解上述命令。
让我们首先创建将在下面提到的示例中使用的 tiamotxt.txt 文件。
$ cat tiamotxt.txt
#Linux
Administration
Scripting
Tips and Tricks
#Windows
Administration
#Database
Mysql
Oracle
Queries
Procedures
1. 使用 Sed 命令将文件内容加倍空格
$sed 'G' tiamotxt.txt
#Linux
Administration
Scripting
Tips and Tricks
#Windows
Administration
#Database
Mysql
Oracle
Queries
Procedures
$
在这个例子中,
- Sed 读取一行并将其放入模式缓冲区中。
- G 命令将保持缓冲区附加到由 \n 分隔的模式缓冲区。所以一个换行符将附加模式空间内容。
- 类似地,如果您想将文件空间增加三倍,请将保持缓冲区内容附加到模式缓冲区两次。(G;G)
2.使用sed命令倒序打印文件内容
以相反的顺序打印文件的行
$sed -n '1!G;h;$p' tiamotxt.txt
Procedures
Queries
Oracle
Mysql
#Database
Administration
#Windows
Tips and Tricks
Scripting
Administration
#Linux
在这个例子中,
- 第一行将按原样放置到保持空间中。
- 从第 2 行开始,只需将保持空间内容附加到模式空间。(记住第 2 行在模式空间中,第 1 行在保持空间中)。
- 现在第 1 行和第 2 行颠倒过来,将其移至保留空间。
- 重复上述步骤直到最后一行。
- 到达最后一行后,只需将保留空间内容附加到模式空间并打印模式空间。
3. 使用 Sed 命令打印段落(仅当它包含给定模式时)
只有在 geekstuff.txt 中包含“管理”模式时才打印段落。
$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' tiamotxt.txt
Linux
Administration
Scripting
Tips and Tricks
Windows
Administration
在这个例子中,
- 直到空行出现,继续将非空行附加到保留空间中
- 当空行到来即段落结束时,在模式和保持空间之间交换数据。这样整个段落将在模式空间中可用。
检查模式“管理”是否可用,如果是,请不要删除它,即打印模式空间
4. 使用 Sed 命令打印模式匹配之前的行
只打印前一行,模式“Mysql”。
$ sed -n '/Mysql/{g;1!p;};h' tiamotxt.txt
#Database
在这个例子中,
- 对于每个循环,如果该行与模式“Mysql”不匹配,则将其放入保持缓冲区。
- 如果该行与模式匹配,则使用 g 命令从保留空间(上一行)中获取数据并打印它。
- 万一,如果第一行与模式“Mysql”匹配,无论如何保持空间将为空。(第一行没有前一行)。所以第一行不应该被打印(1!p)
5.使用sed命令删除每段的最后一行
$ sed -n -e '/^$/{x;d}' -e '/./x;p' tiamotxt.txt
#Linux
Administration
Scripting
#Windows
#Database
Mysql
Oracle
Queries
在这个例子中,
- 如果该行不为空,则在模式和保持空间之间交换行。所以第一行将被放置在保持空间中。
- 当下一个非空行到来时,交换模式空间和保持空间,并打印模式空间。即第一个非空行将被打印,第二行保持不变。并且在下一个循环中,当第 3 行保持不变并像这样继续时,打印第 2 个非空行。
- 当空行到来时(空行的前一行将在保持缓冲区中可用)只需交换模式和保持空间,并删除该行(段落的最后一行)并开始下一个循环。
6. 对于每一行,使用 Sed 命令将前一行附加到其末尾
$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' tiamotxt.txt
#Linux
Administration#Linux
Scripting Administration
Tips and Tricks Scripting
Tips and Tricks
#Windows
Administration#Windows
Administration
#Database
Mysql#Database
Oracle Mysql
Queries Oracle
Procedures Queries
在这个例子中,
- 将第一行放在保持缓冲区中。
- 当第二行到来时,追加到保持空间(第一行)
- 然后交换模式和保持缓冲区。所以现在模式空间将有第一行和第二行由 \n 分隔,保持空间将只有第二行。
- 所以交换模式空间中的线条。
- 上述步骤一直持续到文件末尾
7.将每个块的标签添加到该块的每一行
$ sed '
/^#/{
h
d
}
G
s/^\(.*\)\n#\(.*\)/\2 \1/' tiamotxt.txt
Linux Administration
Linux Scripting
Linux Tips and Tricks
Linux
Windows Administration
Windows
Database Mysql
Database Oracle
Database Queries
Database Procedures
在这个例子中,
- 当遇到一个块的第一行时(以#开头)
- 通过命令“h”将该行保留到保留空间
- 然后使用 'd' 删除以开始另一个循环。
- 对于块的其余行,命令“G”从保留空间附加标记行,替换命令正确地交换标记和行。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)