≡菜单

Unix Sed教程:多行文件操作及6个实际示例

多文件行操作的Linux Sed示例作为我们进行中的一部分 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.

  1. P –打印图案空间的第一行。 (先到\ n)。
  2. 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
  1. 读取第一行并将其放置在模式空间中。
  2. N3d捕鱼达人读取下一行并追加到由换行符分隔的模式空间。 (现在第一行\第二行)
  3. 如果未到达最后一行($),则打印第一行,然后从模式空间中单独删除第一行。然后循环再次开始。
  4. 这样,它会连接第二,第三行,第三,第四行并继续。
  5. 最后,当它在模式空间中有第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.

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux3d捕鱼达人(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find3d捕鱼达人示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 10 评论… 加一 }

  • 浆果 2009年11月25日,上午8:41

    在示例2中,我认为本文提供的3d捕鱼达人仅在连续空白行数为偶数时才有效。因为在左侧,sed‘/./=’仅在非空白行之前打印行号,空白行不会更改。但是在右边,将每两行(非空白和空白)连接成一行,并用空格替换\ n。然后,如果原始文件中连续的空白行数为奇数,则最后一个空白行将与下一行的行号合并。

    例如:
    aa
    空白
    bbb

    左后:
    1
    aa
    空白
    3
    bbb

    因此,我认为解决方案可以在左侧找到
    sed‘/./=’ thegeekstuff.txt | sed‘/./{
    N
    s / \ n / /
    }’

  • 萨西卡拉 2009年11月25日,晚上10:28

    是的,贝里,你是绝对正确的。

  • 马苏德 2010年1月25日,下午5:12

    在示例4中,如果示例脚本中的行总数甚至包括空行,那么我认为我们也可以使用以下sed3d捕鱼达人
    sed‘N;$d’ thegeekstuff.txt

  • 马苏德 2010年1月25日,下午5:31

    在示例5中,输出仅是最后一行,而不是最后两行。您可以确认plz吗?

  • 因德拉内尔·纳格 2010年9月23日,上午4:45

    如何将多行文本文件制作为一个单行文本文件

  • 法兰克 2010年11月17日,下午7:58

    示例5之所以有效,是因为最后一行是空行,并且
    sed-n ‘$!h;$H;$x;$p’ thegeekstuff.txt
    也可以打印文件的最后两行

  • 格雷格 December 27, 2011年年, 5:45 pm

    我有示例#6在Windows批处理文件中作为多行查找/替换工作。我在网上发现的许多其他sed多行示例都没有’在任何情况下都不能工作。但是像下面这样的修改示例#6可以工作:

    sed–text -n -e “s|2011|&|p” -e “$ ^!N; / Directory。* \ n。* 2011 / P; d” input.txt > output.txt

    此sed线在Windows ver下运行。 sed,找到与“2011” or lines with “Directory” 上ly if “2011”在下一行,并且输出重定向到单独的文件。的–文本选项有助于为Windows生成正确的CR / LF。另外,感叹号必须是“escaped”在批处理文件中* IF * enabledelayedexpansion正在上下文中使用。

  • 杰夫 2012年10月4日,下午1:58

    感谢分享。

    或者,我以这种方式解决了示例4:sed‘N; $ d’thegeekstuff.txt,您认为这有问题吗?谢谢。

    BTW: similarly, I did example 5 this way: sed-n ‘N; $ p’ thegeekstuff.txt.

  • 托尼 2012年12月10日,上午11:20

    杰夫,您的解决方案没有’为我工作。您的两个3d捕鱼达人都只打印了整个文本文件,没有删除任何内容。

    当我这样做时,它确实删除了最后一行(而不是最后两行):
    sed‘$d; N’ thegeekstuff.txt

  • 桑耶夫 2014年1月14日,下午2:27

    sed-e :a -e ‘$!N;s/\n=/ /;ta’ -e ‘P;D’
    该行查找下一行是否以“=”并将其合并到上一行。
    :可以修改此3d捕鱼达人,以便查看下一行是否包含“=”并将其合并到上一行。

发表评论