我想抓取 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 f s df s df sf
5678
no way = true + 50
$
答案1
您可以使用/START/,/STOP/模式范围在 sed 中
sed -n '/tok98/,/5678/p' file
/START/ 和 /STOP/ 也可以是 RE
sed -n '/^tok98/,/^5678/p' file
将在以和开头的行之间打印tok98
,5678
并且除非行以这些字符串开头,否则不会开始或停止。
如果你想排除/ START /和/ STOP /那么这应该有效
sed -n '/^tok98/,/^5678/ {/^tok98/b;/^5678/b;p}' file
答案2
sed
默认情况下不处理多行,但可以使用以下技巧解决:
$ cat testfile.txt | tr '\n' ',' | sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' | tr ',' '\n' > text.dmp
您只需要将换行符转换\n
为其他字符,
,然后在完成后将其转换回 \n sed
。您需要确保输入的文件没有任何逗号。