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 r
除fish
.
[...]
是还正则表达式中的特殊运算符(与[...]
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
正则表达式的意思是“匹配orn
或e
.的字符
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