如何仅打印匹配图案

时间:2021-06-28 16:46:26

标签: regex awk sed grep

我只需要打印 [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:[^]]*\]//"

7 个答案:

答案 0 :(得分:3)

如果您每行最多只有 1 个这样的字段,并且希望在该行上不存在这样的字段的情况下打印一个空行,则使用 GNU awk 进行 FPAT:

$ awk -v FPAT='[[]PR:[^]]+]' '{print $1}' 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 $1}' file
[PR:Cook]
[PR:Russell]

[PR:Jack]
[PR:Arnold]

$ awk -v FPAT='[[]PR:[^][]+]' 'NF{print $1}' 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=$1} 1' file
[PR:Cook]
[PR:Russell]

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

答案 1 :(得分:2)

您可能会为此使用 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:[^]]*]\).*/\1/p'

this online demo

或者,您可以使用 awk

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

参见online demo

答案 2 :(得分:2)

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

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

简单的解释是,使用 matchawk 函数查找其中包含 [PR.....] 的所有块,然后打印所有出现的块,直到在每一行中都打印出来。

答案 3 :(得分:2)

使用这个 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]

答案 4 :(得分:2)

另一个 perl:

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

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

这是一个红宝石:

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

每行可容纳多个 PR 标签。

相关问题