Linux Sed 教程:多行文件操作 6 个实例

举报
Tiamo_T 发表于 2022/01/17 08:08:48 2022/01/17
【摘要】 在本文中,让我们了解一下如何在 Sed 中进行多行操作。

在本文中,让我们了解一下如何在 Sed 中进行多行操作。

你还记得我们在使用地址和模式打印文件行教程中学到的 Sed 工作方法吗?在那篇文章中,我们解释了 Sed 逐行读取,删除任何尾随的新行,将一行放入模式空间缓冲区,按照给定的命令进行处理并打印模式空间。

如果要删除文件中的所有换行符,则不能使用以下方法。因为换行符已经被移除并放置在模式空间中。

$ sed 's/\n//' filename or  $sed 's/\n/ENDOFLINE\n/' filename

对于这种情况,sed 多行是合适的。Sed 为多行操作提供命令“N”。

N 命令从输入中读取下一行,将下一行附加到模式空间。下一行由换行符与原始模式空间分隔。


让我们首先创建将在下面提到的所有示例中使用的 tiamotxt.txt 文件。

$ cat tiamotxt.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)


Storage in Linux
Website Design
Website Design
Windows- Sysadmin, reboot etc.
$

注意:上述输入中有两个连续的空行。(第 5 行和第 6 行)。

Sed 示例 1. 连接两条连续的行

$ sed -e '{
N
s/\n/ @ /
}' tiamotxt.txt

Linux Sysadmin @ Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc)
 @
Storage in Linux @ Website Design
Website Design @ Windows- Sysadmin, reboot etc.

在上面的例子中,

  • 花括号“{”和“}”用于对命令进行分组。花括号和 sed 命令必须在单独的行上。
  • Sed 读取第一行并将其放入模式空间,N 命令读取下一行并附加模式空间,即第一行由换行符分隔。所以现在模式空间将有第一行\n第二行。
  • 下一次将 \n 替换为 space@space 并将模式空间内容打印为其 sed 默认行为。所以连续的行由“@”连接和分隔

Sed 示例 2. 为文件的每个非空行编号

正如我们在上一篇文章中提到的,= 是一个获取文件行号的命令。

$ sed '/./=' tiamotxt.txt | sed 'N; s/\n/ /'
1 Linux Sysadmin
2 Databases - Oracle, mySQL etc.
3 Databases - Oracle, mySQL etc.
4 Security (Firewall, Network, Online Security etc)

7 Storage in Linux
8 Website Design
9 Website Design
10 Windows- Sysadmin, reboot etc.
  • 第一个 sed 命令打印行号,如果它不是空白,则在下一行打印原始行。(执行它并查看第一个 sed 命令的输出)。
  • 下一个 sed 命令只是附加一对行。

Sed 示例 3. 从输入中删除两个连续的空行

$ sed '/^$/{
N
/^\n$/d
}' tiamotxt.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)
Storage in Linux
Website Design
Website Design
Windows- Sysadmin, reboot etc.

如果该行为空,则读取并追加下一行,/^\n$/ 表示,两行为空,\n 由N 命令添加。然后只需删除模式空间并使用命令“d”开始下一个循环。

Sed 示例 4. 删除文件的最后 2 行

在查看此示例之前,您必须了解两个有趣的 sed 命令。

  1. P – 打印模式空间的第一行。(直到第一个 \n)。
  2. D – 从模式空间中删除第一行。然后控制权传递到脚本的顶部。
$ sed 'N;$!P;$!D;$d' tiamotxt.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)

Storage in Linux
Website Design
  1. 读取第一行并将其放置在模式空间中。
  2. N 命令读取下一行并附加到由换行符分隔的模式空间。(现在第一行\n第二行)
  3. 如果它没有到达最后一行($),则打印第一行并从模式空间中单独删除第一行。然后循环再次开始。
  4. 像这样它加入第 2\n3 行,第 3\n4 行并继续。
  5. 当它在模式空间中有第 9\n10 行时,它达到 $ 所以它只是删除模式空间。($!P 和 $!D 如果是 $,则不会打印和删除)。

Sed 示例 5. 打印文件的最后 2 行

$ sed '$!N;$!D' tiamotxt.txt
Website Design
Windows- Sysadmin, reboot etc.

以上连接和删除每一行,直到最后两行出现在模式空间中。当它到达 $ 时,打印只有最后两行的模式空间。

Sed 示例 6. 从文件中删除重复的连续行

下面的命令检查与下一行连接的每一行,检查两者是否相同,然后它不是打印模式空间(!P),只需从模式空间中删除第一行。因此,模式空间中只剩下一行。

$ sed '$!N; /^\(.*\)\n\1$/!P; D' tiamotxt.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)

Storage in Linux
Website Design
Windows- Sysadmin, reboot etc.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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