使用sed命令在同一行上输出两个模式之间的文本

时间:2018-03-15 16:52:33

标签: bash search sed replace

我试过这个命令,但它只在一定程度上起作用。

输入文件内容:

this is begin not sure what is wrong end and why not

命令:

cat file | sed 's/.*begin \(.*\)end/\1/'

输出:

not sure what is wrong and why not

期望的输出(请参阅下面的注释):

not sure what is wrong 
  1. 我的sed命令搜索第一个模式和第二个模式,但省略第二个模式并打印文本。但是,它还会打印行的其余部分why not。我不想打印第二个模式之后的内容,只是两个模式之间的内容。我不知道该怎么做。
  2. 如果同一行上有两个end怎么办?
  3. 有人可以提供并解释命令吗?

3 个答案:

答案 0 :(得分:1)

对于您当前的输入,您可以使用此sed

sed 's/.*begin \(.*\) end.*/\1/' file

not sure what is wrong

差异是使用.*之后的end匹配上一个end之后的文字并替换丢弃。

然而,对于你的第二部分,如果有两个end字,sed命令无法正常工作,因为贪婪匹配会找到最后一个end / strong> .*

例如,如果您的输入是:

this is begin not sure what is wrong end and why not end

然后关注awk会更好:

awk -F 'begin | end' '{print $2}' file

not sure what is wrong

答案 1 :(得分:0)

问题是你只是替换了匹配的内容,而不是end之后的其他文本。只需添加.*

即可
txt='this is begin not sure what is wrong end and why not'

sed 's/.*begin \(.*\)end.*/\1/' <<< "$txt"

给出:

not sure what is wrong 

答案 2 :(得分:0)

关注sed可能对您有帮助。

echo "this is begin not sure what is wrong end and why not" | sed 's/.*begin //;s/ end.*//'