我正在创建一个连接到服务器并将输出转储到临时文件的脚本。我想在脚本中使用 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
最简单但不太有效的方法是
使用 tr 删除所有换行符。
tr '\n' ' '
Disconnected
使用 sed命令后重新添加换行符\a
。- 使用您的命令解析该数据
sed
。