将新行视为另一个字符的grep/sed替代方案

将新行视为另一个字符的grep/sed替代方案,sed,awk,grep,Sed,Awk,Grep,grep和sed都逐行处理输入,据我所知,让它们中的任何一个处理多行都不是很简单。我正在寻找的是这两个程序的替代方案,这两个程序将换行符视为另一个字符。是否有符合此类标准的工具您需要的工具是awk。它是面向记录的,而不是面向行的,您可以通过设置内置变量RS来指定记录分隔符。特别是,GNU awk允许您将RS设置为任何正则表达式,而不仅仅是单个字符。下面是一个示例,awk使用一个空行分隔每个记录。如果您向我们展示您拥有的数据,我们可以帮助您 cat file first line second l

grep
sed
都逐行处理输入,据我所知,让它们中的任何一个处理多行都不是很简单。我正在寻找的是这两个程序的替代方案,这两个程序将换行符视为另一个字符。是否有符合此类标准的工具

您需要的工具是
awk
。它是面向记录的,而不是面向行的,您可以通过设置内置变量RS来指定记录分隔符。特别是,GNU awk允许您将RS设置为任何正则表达式,而不仅仅是单个字符。

下面是一个示例,
awk
使用一个空行分隔每个记录。如果您向我们展示您拥有的数据,我们可以帮助您

cat file
first line
second line
third line

fourth line
fifth line
sixth line

seventh line
eight line

more data
在此基础上运行
awk
,并使用空行作为新记录重建数据

awk -v RS= '{$1=$1}1' file
first line second line third line
fourth line fifth line sixth line
seventh line eight line
more data
PS
RS
不等于file,设置为
RS=
空白,等于
RS=”“

1)Sed可以一起处理块行,而不总是逐行处理

在sed中,我通常使用
:loop;$!{N;b循环}
获取由换行符分隔的模式空间中的所有可用行

样本:

Productivity
        Google Search\
        Tips
        "Web Based Time Tracking,
        Web Based Todo list and
        Reduce Key Stores etc"
结果(删除中间的内容)

您应该阅读此URL(Unix Sed教程:Sed分支操作的6个示例),它将为您提供详细的工作原理

2) 对于grep,检查您的grep是否支持-z选项,它不需要逐行处理输入

  -z, --null-data
          Treat  the  input  as  a set of lines, each terminated by a zero
          byte (the ASCII NUL character) instead of a newline.   Like  the
          -Z  or --null option, this option can be used with commands like
          sort -z to process arbitrary file names.

不要在awk参数列表(文件列表所在的位置)中设置变量,除非您有非常具体的原因(例如,您需要在文件之间更改FS)并了解其后果。在这种情况下,请尝试将脚本更改为使用getline作为
awk'BEGIN{getline<“file”;print”“}'RS=file
awk-v RS='BEGIN{getline<'文件“print”“}”文件
并注意差异。未在开始部分填充的变量只是一个结果,它还使处理多个文件变得复杂。若要设置awk变量,请使用
-v var='value'
,除非您有充分的理由不这样做。
  -z, --null-data
          Treat  the  input  as  a set of lines, each terminated by a zero
          byte (the ASCII NUL character) instead of a newline.   Like  the
          -Z  or --null option, this option can be used with commands like
          sort -z to process arbitrary file names.