sed 的正则表达式可以抓取多行还是有更好的方法?

sed 的正则表达式可以抓取多行还是有更好的方法?

我正在创建一个连接到服务器并将输出转储到临时文件的脚本。我想在脚本中使用 sed 从临时文件中获取特定信息。输出将始终包含 80 个字符的虚线,然后是我想要的信息,后面是 Disconnected 语句。

如果它只是一行,我已经得到一个可以工作的正则表达式,问题是如何对换行符进行分组?

正则表达式

-\{80\}[\r\n]*\(.*\)[\r\n]\{4\}Disconnected

文件

...
--------------------------------------------------------------------------------
The information that I want to get can be a single line or multiple lines.
Another line to grab.

And this should be caught as well.

Disconnected ...

期望输出

The information that I want to get can be a single line or multiple lines.
Another line to grab.

And this should be caught as well.

答案1

首先使用 '-n' 标志来抑制自动输出。接下来使用 sed地址引用您感兴趣的部分(从破折号“---”到包含单词“Disconnected”的行)。最后打印模式空间(所有模式空间,因为您对其中的所有内容都感兴趣)。

~$ sed -n '/^---*/,/Disconnected/{p}' inputfile

由于 LF4 请求从结果中删除带有破折号的线,因此进行了编辑。

使用“地址”,您可以引用单个模式空间。因此,您可以对这些单个模式空间执行任何操作。包括通过正则表达式删除行。在示例中,该命令从模式空间中删除由破折号组成的行,从而产生您想要的输出:

~$ sed -n '/^---*/,/Disconnected/{/^---*/d;p}' inputfile

高血压

答案2

sed可以通过将多行连接起来寻找模式,这被称为“保持空间”,如下所示:

$ sed -n '1h;1!H;${;g;s/.*\(-\{80\}.*Disconnected\).*/\1/p;}' file
  • 1h:复制第一行以保留空间
  • 1!H:从第二行开始,追加到保留空间
  • $:最后一行
  • g:将保留空间复制到模式缓冲区
  • s/pattern/substitution/:搜索并替换
  • \1:反向引用模式中的组
  • p: 打印

答案3

最简单但不太有效的方法是

  1. 使用 tr 删除所有换行符。

    tr '\n' ' '
    
  2. Disconnected使用 sed命令后重新添加换行符\a

  3. 使用您的命令解析该数据sed

相关内容