我试过这个命令,但只起到了一定的作用。
输入文件内容:

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

08-27 12:42