如何仅打印匹配模式

How to print matching pattern only

我只需要打印 [PR:XXXXX]。

例如:仅 [Test][PR:John][Finished][Reviewer:SE][PR:John]。 (公关标签)

注意:其他字符串而不是 [PR:XXXXX] 可能会不时更改 例如:

[Test][PR:Cook][Completed]
[Test][Finished][PR:Russell][Reviewer:SE]
[Dump][Reviewer:SE][Complete][PR:Arnold]

注意:没有多行输入,所有输入只包含一个PR标签。

直到我创建了以下 sed 命令但它不起作用:

sed "s/\[PR:[^]]*\]//"

您可以为此使用 bash:

s='[Test][PR:Cook][Completed]'
regex='\[PR:[^]]*]'
[[ "$s" =~ $regex ]] && echo "${BASH_REMATCH[0]}"
# => [PR:Cook]

this online demo

您可以使用 grep:

grep -o '\[PR:[^]]*]'

this demo

或者,您可以使用这个 sed:

sed -n 's/.*\(\[PR:[^]]*]\).*//p'

参见this online demo

或者,您可以使用 awk

awk 'match([=13=],/\[PR:[^]]*]/) {print substr([=13=],RSTART,RLENGTH)}'

参见online demo

如果你每行最多只有 1 个这样的字段,并且如果该行不存在这样的字段,则想要打印一个空行,然后使用 GNU awk 进行 FPAT:

$ awk -v FPAT='[[]PR:[^]]+]' '{print }' file
[PR:Cook]
[PR:Russell]
[PR:Arnold]

如果每行可以有 0 到 N 个这样的字段,例如:

$ cat file
[Test][PR:Cook][Completed]
[Test][Finished][PR:Russell][Reviewer:SE]
[Test][Finished][Reviewer:SE]
[Test][Finished][PR:Jack][PR:Russell][Reviewer:SE]
[Dump][Reviewer:SE][Complete][PR:Arnold]

然后根据您的要求,这里有一些选项:

$ awk -v FPAT='[[]PR:[^][]+]' '{print }' file
[PR:Cook]
[PR:Russell]

[PR:Jack]
[PR:Arnold]

$ awk -v FPAT='[[]PR:[^][]+]' 'NF{print }' file
[PR:Cook]
[PR:Russell]
[PR:Jack]
[PR:Arnold]

$ awk -v FPAT='[[]PR:[^][]+]' '{for (i=1; i<=NF; i++) print $i}' file
[PR:Cook]
[PR:Russell]
[PR:Jack]
[PR:Russell]
[PR:Arnold]

$ awk -v FPAT='[[]PR:[^][]+]' '{=} 1' file
[PR:Cook]
[PR:Russell]

[PR:Jack] [PR:Russell]
[PR:Arnold]

如果要在一行中打印超过 1 次 [PR,请尝试以下操作。

awk '{while(match([=10=],/\[PR:[^]]*\]/)){print substr([=10=],RSTART,RLENGTH);[=10=]=substr([=10=],RSTART+RLENGTH)}}' Input_file

简单的解释就是,使用 awkmatch 函数找到所有包含 [PR.....] 的块,然后打印所有出现的地方,直到每一行都打印出来。

这是一个更短的 gnu-awk 解决方案(使用与 Ed 的回答相同的输入文件):

awk -v RS='\[PR:[^]]+]' 'RT {print RT}' file

[PR:Cook]
[PR:Russell]
[PR:Jack]
[PR:Russell]
[PR:Arnold]

使用这个 perl 命令行:

perl -pe 's/\[[^P][^R][^:].*?\]//g' your_file

下面的测试:

$ echo "[Test][Finished][PR:Russell][Reviewer:SE][PR:Rachel]"|perl -pe 's/\[[^P][^R][^:].*?\]//g'
[PR:Russell][PR:Rachel]

另一个 perl:

perl -lne 'print join "", grep {/^\[PR:/} /\[.+?\]/g' file

这将在一行中容纳多个 P 标签。

这是一个Ruby:

ruby -lne 'puts $_.scan(/\[PR.+?\]/).join("")' file

每行可容纳多个 PR 标签。