作为我们进行中的一部分 UNIX sedtutorial series 前面我们用模式空间中的单行介绍了打印,删除,替换,文件写入,文件操作3d捕鱼达人等。
在本文中,让我们回顾一下如何在Sed中执行多行操作。
您还记得我们从中学到的Sed工作方法吗 our first sedtutorial ?在那篇文章中,我们解释了Sed逐行读取,删除所有尾随的新行,将一行放置在模式空间缓冲区中,按照给定3d捕鱼达人进行处理并打印模式空间。
如果要删除文件中的所有换行符,则不能使用以下方法。因为换行已被删除并放置在模式空间中。
$ sed's/\n//' filename or $sed 's/\n/ENDOFLINE\n/' filename
对于这种情况,sed多行是合适的。 Sed提供3d捕鱼达人“N”用于多线操作。
N3d捕鱼达人从输入中读取下一行,将下一行追加到模式空间。下一行由换行符与原始模式空间分开。
让我们首先创建thegeekstuff.txt文件,该文件将在下面提到的所有示例中使用。
$ cat thegeekstuff.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/ @ / }' thegeekstuff.txt Linux Sysadmin @ Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc) @ Storage in Linux @ 网站 Design Website Design @ Windows- Sysadmin, reboot etc.
在上面的示例中,
- 花括号“{” and “}” used to group the commands. 花括号and sedcommands must be 上 the seperate lines.
- Sed读取第一行并将其放置在模式空间中,N3d捕鱼达人读取下一行并附加模式空间,即第一行由换行符分隔。因此,现在模式空间将具有第一行\第二行。
- 下一步将\ n替换为space @ space,并打印模式空间内容作为sed的默认行为。因此连续的行由” @ “
Sed示例2。为文件的每个非空白行编号
正如我们上一篇文章中提到的,=是获取文件行号的3d捕鱼达人。
$ sed'/./=' thegeekstuff.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 网站 Design 9 网站 Design 10 Windows- Sysadmin, reboot etc.
- 第一个sed3d捕鱼达人将打印行号,如果不是空白,则在下一行打印原始行。(执行它并查看第一个sed3d捕鱼达人的输出)。
- Next sedcommand is just appends pair of lines.
Sed示例3.从输入中删除两个连续的空白行
$ sed'/^$/{ N /^\n$/d }' thegeekstuff.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由N3d捕鱼达人添加。然后只需删除模式空间并使用3d捕鱼达人开始下一个循环‘d’.
Sed示例4.删除文件的最后2行
Before viewing this example you must aware of two interesting sedcommand.
- P –打印图案空间的第一行。 (先到\ n)。
- D –从模式空间删除第一行。控制然后传递到脚本的顶部。
$ sed'N;$!P;$!D;$d' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design
- 读取第一行并将其放置在模式空间中。
- N3d捕鱼达人读取下一行并追加到由换行符分隔的模式空间。 (现在第一行\第二行)
- 如果未到达最后一行($),则打印第一行,然后从模式空间中单独删除第一行。然后循环再次开始。
- 这样,它会连接第二,第三行,第三,第四行并继续。
- 最后,当它在模式空间中有第9 \ n10行时,它达到$,因此只删除模式空间。 (如果是$,则$!P和$!D不会打印和删除)。
Sed示例5.打印文件的最后两行
$ sed'$!N;$!D' thegeekstuff.txt 网站 Design Windows- Sysadmin, reboot etc.
上面的语句将连接并删除每一行,直到模式空间中的最后两行都存在为止。当它达到$时,将打印只有最后两行的模式空间。
Sed示例6.从文件中删除重复的连续行
下面的3d捕鱼达人检查与下一行连接的每一行,检查两者是否相同,然后执行’t打印图案空间(!P),只需从图案空间中删除第一行。因此,模式空间中仅剩余一行。
$ sed'$!N; /^\(.*\)\n\1$/!P; D' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Windows- Sysadmin, reboot etc.
如果您喜欢这篇文章,您可能还会喜欢..
![]() |
![]() |
![]() |
![]() |
在示例2中,我认为本文提供的3d捕鱼达人仅在连续空白行数为偶数时才有效。因为在左侧,sed‘/./=’仅在非空白行之前打印行号,空白行不会更改。但是在右边,将每两行(非空白和空白)连接成一行,并用空格替换\ n。然后,如果原始文件中连续的空白行数为奇数,则最后一个空白行将与下一行的行号合并。
例如:
aa
空白
bbb
左后:
1
aa
空白
3
bbb
因此,我认为解决方案可以在左侧找到
sed‘/./=’ thegeekstuff.txt | sed‘/./{
N
s / \ n / /
}’