命令行工具,用于打印某些匹配关键字之间的所有字符

时间:2014-03-14 18:43:12

标签: linux text command-line awk grep

考虑一对关键字:start-wordstop-word。是否有类似于grepawk的命令行Linux工具可以打印文本文件中start-wordstop-word之间的所有行?

例如,文本文件:

  


  夸夸其谈
  等等
  开始的消息
  消息内容行1
  消息内容行2
  端的消息
  页脚
  夸夸其谈
  嗒嗒

通过将start-word指定为'begin-message'并将stop-word指定为'end-message',预期输出应为:

  

消息内容行1
  消息内容第2行

编辑:开始 - 停止 - 单词可能包含不能仅以awk正则表达式模式输入的特殊字符,例如“ ** BEGIN MESSAGE ** ”开头 - 字。

4 个答案:

答案 0 :(得分:6)

awk '/begin-message/{ P=1; next } /end-message/ {exit} P' new.txt

答案 1 :(得分:1)

使用

$ perl -00ne 'print $1 if /begin-message\n(.*)end-message/s' /tmp/file
message content line 1
message content line 2

答案 2 :(得分:1)

不包括START END

awk '/START/{f=1;next} /END/{f=0} f'

awk '/END/{f=0} f; /START/{f=1}'

包括START END

awk '/START/{f=1} /END/{f=0;print} f'

awk '/START/{f=1} f; /END/{f=0}' 

awk '/START/,/END/' 

答案 3 :(得分:0)

以下是gnu-sed

sed -n '
/begin-message/,/end-message/ {
/begin-message/b
/end-message/b
p
}' file

测试:

$ cat file
header
blah-blah
blah
begin-message
message content line 1
message content line 2
end-message
footer
blah-blah
blah

$ sed -n '
/begin-message/,/end-message/ {
/begin-message/b
/end-message/b
p
}' file
message content line 1
message content line 2