我试图仅在由-
(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
我不仅限于使用sed
。 awk
,tr
等也很好。
答案 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
条件分支是您只需要的