Linux Sed 教程:Sed 保持和模式缓冲区操作的 7 个示例

举报
Tiamo_T 发表于 2022/01/19 08:11:16 2022/01/19
【摘要】 在这篇文章中,让我们通过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 

$

在这个例子中,

  1. Sed 读取一行并将其放入模式缓冲区中。
  2. G 命令将保持缓冲区附加到由 \n 分隔的模式缓冲区。所以一个换行符将附加模式空间内容。
  3. 类似地,如果您想将文件空间增加三倍,请将保持缓冲区内容附加到模式缓冲区两次。(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

在这个例子中,

  1. 第一行将按原样放置到保持空间中。
  2. 从第 2 行开始,只需将保持空间内容附加到模式空间。(记住第 2 行在模式空间中,第 1 行在保持空间中)。
  3. 现在第 1 行和第 2 行颠倒过来,将其移至保留空间。
  4. 重复上述步骤直到最后一行。
  5. 到达最后一行后,只需将保留空间内容附加到模式空间并打印模式空间。

3. 使用 Sed 命令打印段落(仅当它包含给定模式时)

只有在 geekstuff.txt 中包含“管理”模式时才打印段落。

$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d'  tiamotxt.txt 

Linux
        Administration
        Scripting
        Tips and Tricks

Windows
        Administration

在这个例子中,

  1. 直到空行出现,继续将非空行附加到保留空间中
  2. 当空行到来即段落结束时,在模式和保持空间之间交换数据。这样整个段落将在模式空间中可用。
    检查模式“管理”是否可用,如果是,请不要删除它,即打印模式空间

4. 使用 Sed 命令打印模式匹配之前的行

只打印前一行,模式“Mysql”。

$ sed -n '/Mysql/{g;1!p;};h'  tiamotxt.txt 
#Database

在这个例子中,

  1. 对于每个循环,如果该行与模式“Mysql”不匹配,则将其放入保持缓冲区。
  2. 如果该行与模式匹配,则使用 g 命令从保留空间(上一行)中获取数据并打印它。
  3. 万一,如果第一行与模式“Mysql”匹配,无论如何保持空间将为空。(第一行没有前一行)。所以第一行不应该被打印(1!p)

5.使用sed命令删除每段的最后一行

$ sed -n -e '/^$/{x;d}' -e '/./x;p'  tiamotxt.txt 
#Linux
        Administration
        Scripting

#Windows

#Database
        Mysql
        Oracle
        Queries

在这个例子中,

  1. 如果该行不为空,则在模式和保持空间之间交换行。所以第一行将被放置在保持空间中。
  2. 当下一个非空行到来时,交换模式空间和保持空间,并打印模式空间。即第一个非空行将被打印,第二行保持不变。并且在下一个循环中,当第 3 行保持不变并像这样继续时,打印第 2 个非空行。
  3. 当空行到来时(空行的前一行将在保持缓冲区中可用)只需交换模式和保持空间,并删除该行(段落的最后一行)并开始下一个循环。

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

在这个例子中,

  1. 将第一行放在保持缓冲区中。
  2. 当第二行到来时,追加到保持空间(第一行)
  3. 然后交换模式和保持缓冲区。所以现在模式空间将有第一行和第二行由 \n 分隔,保持空间将只有第二行。
  4. 所以交换模式空间中的线条。
  5. 上述步骤一直持续到文件末尾

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

在这个例子中,

  1. 当遇到一个块的第一行时(以#开头)
    • 通过命令“h”将该行保留到保留空间
    • 然后使用 'd' 删除以开始另一个循环。
  2. 对于块的其余行,命令“G”从保留空间附加标记行,替换命令正确地交换标记和行。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。