如何使用 sed 获取文本?

如何使用 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  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

将在以和开头的行之间打印tok985678并且除非行以这些字符串开头,否则不会开始或停止。

如果你想排除/ 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。您需要确保输入的文件没有任何逗号。

相关内容