在单独的行或单行上的模式之间进行 Grep

在单独的行或单行上的模式之间进行 Grep

所以我需要的是 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' ' '。此添加只是用空格替换换行符*

*这将用空格替换所有输出换行符。因此,如果您的初始输入是行分隔的,这些换行符将会丢失。

相关内容