替换Bash中字符串的一部分中的字符

时间:2015-06-09 01:01:50

标签: regex bash awk sed

我试图仅在由-(3下划线)分隔的中间(第二)部分中将:?替换为___

输入:

aaa___bb-bb:bbb___cc-cc:ccc
d-d___d-ddd:d-d___e-e:e

输出:

aaa___bb?bb?bbb___cc-cc:ccc
d-d___d?ddd?d?d___e-e:e

我尝试了以下sed命令,但它只替换了中间部分-:的最后一次出现

echo "aaa___bb-bb:bbb___cc-cc:ccc
d-d___d-ddd:d-d___e-e:e" | sed "s|\(___[^_]*\)[-:]\([^_]*___\)|\1?\2|g"

输出:

aaa___bb-bb?bbb___cc-cc:ccc
d-d___d-ddd:d?d___e-e:e

我不仅限于使用sedawktr等也很好。

3 个答案:

答案 0 :(得分:5)

尝试:

awk -F"___" '{gsub(/[-:]/,"?",$2)}1' OFS="___"

答案 1 :(得分:3)

在纯本机bash中,没有外部实用程序:

in='aaa___bb-bb:bbb___cc-cc:ccc
d-d___d-ddd:d-d___e-e:e'

while IFS= read -r line; do
   first=${line%%___*}
   last=${line##*___}
   middle=${line#*___}; middle=${middle%___*}
   printf '%s\n' "${first}___${middle//[-:]/?}___${last}"
done <<<"$in"

答案 2 :(得分:1)

你接近sed解决方案

sed -r ':a; s/(___.*)[-:](.*___)/\1?\2/; ta' file

条件分支是您只需要的