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