仅在 [word] 之后的 Grep 文本:

仅在 [word] 之后的 Grep 文本:

example.txt我有一个包含以下文本的文件:

[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc

我需要 grep 并仅显示之后的文本[myword]:尝试通过这种方式进行测试:

grep [myword] /tmp/example.txt | cut -d ':' -f 2

在每一个上[myword]它都打印出所有括号后的内容,但是我怎样才能只得到我需要的而不是全部呢?

我只需要打印某些括号后面的测试。例如,我只想打印行内的文本[one]: ,而不是行后的[two]:文本[onemore]:,以便输出为bla bla bla onebla twobla.如果我想打印所有内容[onemore]:- 正确的输出应该是i got mad and etc

答案1

更好的是sed

sed -n 's/^\[one]: //p' < example.txt

grep使用支持最新 PCRE 的GNU ,您还可以执行以下操作:

grep -Po '^\[one]: \K.*' < example.txt

或者

grep -xPo '\[one]: \K.*' < example.txt

无论如何,请注意,在大多数 shell 中,[...]都是 glob 运算符。在grep [myword],中[myword]扩展为与该文件匹配的文件列表,即当前目录中名称为m, y, w, o,r或 的任何文件d(如果没有,则根据 shell,该模式将按原样传递到grep,或你会得到一个错误)。因此必须为 shell 引用它们(例如使用单引号,如此处的解决方案中所示)。例如,如果r当前目录中有一个名为 的文件,并且一个名为d,的文件grep [myword]将在grep d rfish.

[...]正则表达式中的特殊运算符(与[...]glob 运算符非常相似)grep '[myword]'将匹配包含m, y, w, o,r或 的行d。因此,您还需要转义[for grep(对于正则表达式)的开头。这可以用grep '\[myword]'或 来完成grep '[[]myword]'

^是另一个正则表达式运算符,意思是:仅在行的开头匹配。因此grep '^\[myword]: '匹配以 开头的行[myword]:

虽然grep只是为了打印匹配的行(不是像流编辑器那样的流编辑器sed),但 GNUgrep添加了非标准-o选项来打印行的匹配部分(如果非空)。它还添加了-P使用 perl 兼容正则表达式(在 PCRE 中)的选项,而不是没有-P.

在最近的 PCRE 中,\K是一个运算符重置匹配部分的开始。因此grep -Po '^\[one]: \K.*',我们确实打印了匹配部分,因为-o,但是因为,该匹配部分变成了之后找到的\K字符序列 ( ) 。.*[one]:

答案2

如果您希望独立于分隔符的解决方案,请使用awk

$ cat 304162 
[one]: bla bla bla onebla twobla
[two]: hey heya noheya
[onemore]: i got mad and etc
[fourth:one]: some more bla, well ! worst case
$ awk '/\[onemore\]/{sub(/^[^]]*\]:[[:blank:]]*/,"");print}' 304162
i got mad and etc
$ awk '/\[fourth:one\]/{sub(/^[^]]*\]:[[:blank:]]*/,"");print}' 304162
some more bla, well ! worst case

答案3

[one]o正则表达式的意思是“匹配orne.的字符
grep [one] /tmp/example.txt 将匹配示例中的所有行

要匹配[]as 字符,您需要转义它们:

grep \\[one\\] /tmp/example.txt   | cut -d ':' -f 2

或者您可以使用grep -F忽略正则表达式语法:

grep -F [one] /tmp/example.txt | cut -d ':' -f 2

相关内容