Linux Sed 教程:多行文件操作 6 个实例
【摘要】 在本文中,让我们了解一下如何在 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 命令。
- P – 打印模式空间的第一行。(直到第一个 \n)。
- 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
- 读取第一行并将其放置在模式空间中。
- N 命令读取下一行并附加到由换行符分隔的模式空间。(现在第一行\n第二行)
- 如果它没有到达最后一行($),则打印第一行并从模式空间中单独删除第一行。然后循环再次开始。
- 像这样它加入第 2\n3 行,第 3\n4 行并继续。
- 当它在模式空间中有第 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)