所以我需要的是 grep 仅匹配我的匹配模式之间(并包括)之间的文本。
像这样的东西(不要介意文字,这只是一些乱码:D):
asdgfasd gasd gdas g This will be this one day ksjadnbalsdkbgas asd gasdg
asdgasdgasdg dasg dasg dasg This will be this next day adf gdsf gdsf sdfh dsfhdfsh
asdf asdf asd fesf dsfasd f This will won' not this day asdgadsgaseg as dvf as d vfa se v asd
dasfasdfdas fase fasdfasefase fasdf This not what shoes day asdjbna;sdgbva;sdkbcvd;lasb ;lkbasi hasdli glais g
所以我想要的是这样的:
cat theabovetext|grep -E "^This * day$"
输出:
This will be this one day
This will be this next day
This will won' not this day
This not what shoes day
所以基本上我只想获取“This”和“Day”之间的文本(包括“This”和“day”),无论中间有多少个字符,也不管“This”之前和“Day”之后有多少个字符。即使输入全部在一行上,这也需要工作,所以:
asdgfasd gasd gdas g This will be this one day ksjadnbalsdkbgas asd gasdg asdgasdgasdg dasg dasg dasg This will be this next day adf gdsf gdsf sdfh dsfhdfsh asdf asdf asd fesf dsfasd f This will won' not this day asdgadsgaseg as dvf as d vfa se v asd dasfasdfdas fase fasdfasefase fasdf This not what shoes day asdjbna;sdgbva;sdkbcvd;lasb ;lkbasi hasdli glais g
必须输出这个:
This will be this one day This will be this next day This will won' not this day This not what shoes day
注意这里的输出仍然在一行上。
答案1
使用 GNU,grep
您可以执行以下操作:
grep -o 'This.*day' theabovetext
(请注意,您不需要,cat
因为grep
知道如何读取文件)
该-o
标志表示仅显示与模式匹配的行部分。
我怀疑其他版本grep
也支持这个标志,但它不在 POSIX 中,所以它不一定是可移植的。
答案2
如果您希望单独处理行(您的第一个示例),但要在单行上输出每行的多个匹配项(如您的第二个示例),那么我认为grep
单独处理是不可能的。
然而,在 perl 本身中使用相同的This.*?day
非贪婪匹配,你可以这样做
$ perl -lne 'print join " ", /This.*?day/g' theabovetext1
This will be this one day
This will be this next day
This will won' not this day
This not what shoes day
而对于单行输入
$ perl -lne 'print join " ", /This.*?day/g' theabovetext2
This will be this one day This will be this next day This will won' not this day This not what shoes day
答案3
埃里克·雷诺夫的回应完成了大部分工作。 Steeldriver 的注释通过使其非贪婪来删除给定行中的额外文本。
所以看起来像: grep -oP 'This.*?day' theabovetext
除了输出在多行上之外,可以执行您想要的所有操作。
要将输出放在一行上,您可以这样做grep -oP 'This.*?day' theabovetext | tr '\n' ' '
。此添加只是用空格替换换行符*
*这将用空格替换所有输出换行符。因此,如果您的初始输入是行分隔的,这些换行符将会丢失。