我试过这个命令,但只起到了一定的作用。
输入文件内容:
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
sed命令搜索第一个模式和第二个模式,但忽略第二个模式并打印文本。但是,它也打印行的其余部分,
why not
。我不想打印第二个模式之后的内容,只想打印两个模式之间的内容。我不知道怎么做。如果同一条线上有两个
end
怎么办?有人能提供并解释这个命令吗?
最佳答案
对于您当前的输入,您可以使用这个sed
:
sed 's/.*begin \(.*\) end.*/\1/' file
not sure what is wrong
不同的是使用
.*
后的end
匹配最后end
后的文本并在替换中丢弃。但是,对于第二部分,如果有两个
end
单词,sed
命令将无法正常工作,因为它将找到最后一个end
单词,因为贪婪地匹配.*
。例如,如果您的输入是:
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