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

时间:2014-01-18 07:38:35

标签: sed awk grep

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

以下是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=""

答案 2 :(得分:0)

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

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

样品:

Productivity
        Google Search\
        Tips
        "Web Based Time Tracking,
        Web Based Todo list and
        Reduce Key Stores etc"

结果(删除“)之间的内容

sed -e ':loop; $!{N; b loop}; s/\"[^\"]*\"//g' thegeekstuff.txt

Productivity
        Google Search\
        Tips

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

http://www.thegeekstuff.com/2009/12/unix-sed-tutorial-6-examples-for-sed-branching-operation/

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.