如果模式使用unix命令具有特定字符串,我只想打印匹配模式。
例如:在25487
文件中找到xyz.txt
,然后将please
和till here
之间的文本从xyz.txt
文件打印到新文件。
xyz.txt文件......
.........
..
....
...
please print 25487 this
sadf
sdfa
sdfasgda
till here
.....
.........
..
please print 45862 this
qret
ret
ASF
H
till here
.........
..
....
...
最后只打印
please print 25487 this
sadf
sdfa
sdfasgda
till here
答案 0 :(得分:2)
sed
可以很容易地做到这一点。
sed -n '/25487/, /till here/ p'
<强>测试强>
$ sed -n '/25487/, /till here/ p' input
please print 25487 this
sadf
sdfa
sdfasgda
till here
它的作用是什么?
-n
禁止打印图案空间
'/25487/, /till here/
地址范围。选择两个模式之间的所有行并执行以下操作。
此处选择25487
和till here
p
打印图案空间。
答案 1 :(得分:1)
你可以使用grep。
$ grep -oPz '(?s)\bplease\b.*?25487.*?\btill here\b' file
please print 25487 this
sadf
sdfa
sdfasgda
till here
(?s)
DOTALL修饰符,它使正则表达式中的点也匹配换行符。默认情况下,点不会匹配换行符。
答案 2 :(得分:1)
只需使用grep
中的上下文选项即可获取当前行之后的行。 -A
选项会为您提供所需的内容,只需指定当前行后您想要的行数,这样就可以了:
grep -A 4 25487 xyz.txt > newfile.txt
-A 4
将匹配当前匹配行之后的4行。如果您在使用-B
之前想要4行,并且如果您想要在当前行之前和之后使用-C
。
答案 3 :(得分:1)
一个简单的awk
awk '/25487/,/till here/' xyz.txt
please print 25487 this
sadf
sdfa
sdfasgda
till here
如果您还有其他测试,这样做会更好:
awk '/25487/{f=1} f; /till here/{f=0}' xyz.txt
或者
awk '/25487/{f=1} /till here/{f=0;print} f' xyz.txt
答案 4 :(得分:0)
sed '/please/,/till here/!d
H
/till here/!b
s/.*//
x
/25487/!d
s/.//p' YourFile
please
开头,以till here
结尾并且循环(转到下一行条目)的部分之外till here
一致,则循环25847
,请删除并循环