我试过这个命令,但它只在一定程度上起作用。
输入文件内容:
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
why not
。我不想打印第二个模式之后的内容,只是两个模式之间的内容。我不知道该怎么做。end
怎么办?有人可以提供并解释命令吗?
答案 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.*//'