我的目标是提取包含特定关键字的文本段落。不只是包含关键字的行,而是整个段落。对我的文本文件强加的规则是每个段落都以某种模式(例如Pa0)开头,该模式仅在段落开头的整个文本中使用。每个段落都以换行符结束。
例如,假设我有以下文字:
Pa0
This is the first paragraph bla bla bla
This is another line in the same paragraph bla bla
This is a third line bla bla
Pa0
This is the second paragraph bla bla bla
Second line bla bla My keyword is here!
bla bla bla
bla
Pa0
Hey, third paragraph bla bla bla!
bla bla
Pa0
keyword keyword
keyword
Another line! bla
我的目标是提取包含“关键字”一词的这些段落。例如:
Pa0
This is the second paragraph bla bla bla
Second line bla bla My keyword is here!
bla bla bla
bla
Pa0
keyword keyword
keyword
Another line! bla
我可以使用例如关键字的grep和-A,-B或-C选项在关键字所在的行之前和/或之后获得一定数量的行,但这似乎不够,因为文本块的开头和结尾取决于分隔符“Pa0”和“\ n”。
对grep
或其他工具(例如awk,sed,perl)的任何建议都会有所帮助。
答案 0 :(得分:8)
awk
很简单:
awk '/keyword/' RS="\n\n" ORS="\n\n" input.txt
说明:
通常awk按行进行操作,因为记录分隔符RS
的默认值为\n
(单个新行)。通过将RS
按顺序更改为两个新行(空行),我们可以轻松地按段落操作。
/keyword/
是一个条件,一个正则表达式。由于条件awk
只会打印未更改的记录(段落),如果它包含keyword
,则没有任何操作。
将输出记录分隔符ORS
设置为\n\n
会将输出的段落与空行分开,就像在输入中一样。
答案 1 :(得分:1)
希望这会有所帮助
sed -n'/ Pa0 /,/ ^ $ / p'filename
cat filename | sed -n'/ Pa0 /,/ ^ $ / p'
-n ,禁止自动打印图案空间
-p ,打印当前模式空间
/ Pa0 / ,以Pa0模式
开头的段落/ ^ $ / ,以空行结尾的段落
^ ,行开头
$ ,行尾
答案 2 :(得分:0)
如果text.txt包含您想要的文本,则:
$ sed -e '/./{H;$!d;}' -e 'x;/keyword/!d;' text.txt
Pa0
This is the second paragraph bla bla bla
Second line bla bla My keyword is here!
bla bla bla
bla
Pa0
keyword keyword
keyword
Another line! bla