如何使用sed获取文本?

我想抓住tok98和5678之间的文本并将其转储到文件中。

如果tok98和5678在同一行我可以使用这个

sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' testfile.txt > text.dmp 

但是当令牌垂直间隔不工作,我怎么能重写这个sed在这里工作

 $ cat testfile.txt do with > 9 tok98 fdf df s df sd f sd v dvsdv dvf sd vs vs dv sdfsd 2323 2323 232 {} sfdf sd fs df s df sf 5678 no way = true + 50 $ 

您可以在sed中使用/ START /,/ STOP / pattern范围

 sed -n '/tok98/,/5678/p' file 

/ START /和/ STOP /也可以是RE

 sed -n '/^tok98/,/^5678/p' file 

会在从tok985678开始的行之间打印,除非行以这些string开头,否则不会启动或停止。

如果你想排除/开始/和/停止/那么这应该工作

 sed -n '/^tok98/,/^5678/ {/^tok98/b;/^5678/b;p}' file 

默认情况下sed不会处理多行,但是可以使用如下的技巧来解决:

 $ cat testfile.txt | tr '\n' ',' | sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' | tr ',' '\n' > text.dmp 

您只需要将换行符转换为其他字符,然后使用sed将其转换回\ n。 你需要确保你input的文件没有任何逗号。