我只需要打印 [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:[^]]*\]//"
答案 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]
您可以使用grep
:
grep -o '\[PR:[^]]*]'
或者,您可以使用此 sed
:
sed -n 's/.*\(\[PR:[^]]*]\).*/\1/p'
或者,您可以使用 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
简单的解释是,使用 match
的 awk
函数查找其中包含 [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 标签。