如何仅删除匹配的字符串部分

时间:2021-07-05 11:03:46

标签: regex sed

我需要从只打印“[PR:]”的 [PR:Parker] 中删除 ParkerS

注意:[PR:xxxxxxx] "xxxxxxx" 部分会不时更改。

到目前为止,我已经创建了以下 sed 命令:

sed 's/[PR:]//g' | sed 's/[][]//g'

但它打印的“arkerS”也缺少名称中的“P”。

2 个答案:

答案 0 :(得分:4)

第一个解决方案:使用 awk,使用您显示的示例,请尝试一次以下代码。使用 gsub 函数全局替换起始 [ 后跟 PR:] 以 NULL 结尾并打印行的其余值。

awk '{gsub(/^\[PR:|\]$/,"")} 1' Input_file

第二个解决方案:awk 代码中使用不同的字段分隔符来根据显示的示例获取倒数第二个值,请尝试以下操作。

awk -F':|\\]' '{print $(NF-1)}' Input_file

第三种解决方案: 使用 matchawk 函数尝试以下操作。匹配正则表达式 /:[^]]*/: 的第 1 次出现到 ] 出现之前,并仅根据要求打印匹配的部分。

awk 'match($0,/:[^]]*/){print substr($0,RSTART+1,RLENGTH-1)}' Input_file

第四个解决方案: 在这里使用参数扩展的bash功能。如果您在 shell 变量中有这个值,那么这将是最佳解决方案。

##If your shown sample is in a shell variable, use parameter expansion then.
var="[PR:Parker]"

##Create interim variable var1 to remove everything from starting till : here.
var1="${var##*:}"
echo "$var1"
Parker]

##Then on var1 remove ] and get needed value here.
echo "${var1%*]}"
Parker

第五个解决方案: 使用 perl one liner try follow,执行全局替换以删除开头的 [PR: 和结尾的 ]空。

perl -pe 's/^\[PR:|\]$//g' Input_file

答案 1 :(得分:2)

你可以使用

sed 's/\[PR:\([^][]*\)]/\1/' <<< "[PR:Parker]"

这里,\[PR:\([^][]*\)] 匹配 [PR:,然后除 [] 之外的任何零个或多个字符都被捕获到组 1 中,] 是匹配,并且匹配被替换为组 1 值(带有 \1 占位符)。

或者,

sed -E 's/\[PR:|]//g' <<< "[PR:Parker]"

参见online demo。此处,\[PR:|] 匹配 [PR:]s 命令删除它们。

相关问题