如何仅打印匹配模式
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]
您可以使用 grep
:
grep -o '\[PR:[^]]*]'
或者,您可以使用这个 sed
:
sed -n 's/.*\(\[PR:[^]]*]\).*//p'
或者,您可以使用 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
简单的解释就是,使用 awk
的 match
函数找到所有包含 [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 标签。
我只需要打印 [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]
您可以使用 grep
:
grep -o '\[PR:[^]]*]'
或者,您可以使用这个 sed
:
sed -n 's/.*\(\[PR:[^]]*]\).*//p'
或者,您可以使用 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
简单的解释就是,使用 awk
的 match
函数找到所有包含 [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 标签。