sed仅在两个已知字符串之间替换字符

时间:2012-02-09 00:34:13

标签: regex shell sed

是否可以仅替换两个已知字符串之间的字符?我有许多格式为

的文件

title.header.index.subtitle.goes.here.footer

我可以选择“subtitle.goes.here”,索引(我需​​要反向引用)和页脚(它是常量)之间的模式匹配,但我想用一个句点替换句点/点字符强调,给我

title.header.index.subtitle_goes_here.footer

所以来自

等输入

title.header.01.the.first.subtitle.is.here.footer

我想以

结束

title.header.01.the_first_subtitle_is_here.footer

到目前为止,我没有用,但是一个开始: sed -r 's/([0-9][0-9]\.)([a-z]*\.*)*footer/\1footer/g'

但这是删除整个字幕和页脚,然后手动添加它并且还有很多其他缺陷我敢肯定。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

这可能对您有用:

echo "title.header.01.the.first.subtitle.is.here.footer" |
sed 's/\./_/4g;s/.\(footer\)/.\1/'
title.header.01.the_first_subtitle_is_here.footer

一个丑陋的选择:

sed 'h;s/\([0-9][0-9]\.\).*\(\.footer\)/\1\n\2/;x;s/.*[0-9][0-9]\.\(.*\).footer/\1/;s/\./_/g;x;G;s/\(\n\)\(.*\)\1\(.*\)/\3\2/' file

答案 1 :(得分:1)

如果您对awk解决方案持开放态度,那么这可能有所帮助 -

awk '
{for (i=1;i<=NF;i++) if (i!=NF) {printf (3<i && i<(NF-1))?$i"_":$i"."} print $NF}
' FS='.' OFS='.' file 

输入文件:

[jaypal:~/Temp] cat file
title.header.index.subtitle.goes.here.footer
title.header.01.the.first.subtitle.is.here.footer

测试:

[jaypal:~/Temp] awk '
{for (i=1;i<=NF;i++) if (i!=NF) {printf (3<i && i<(NF-1))?$i"_":$i"."} print $NF}
' FS='.' OFS='.' file 
title.header.index.subtitle_goes_here.footer
title.header.01.the_first_subtitle_is_here.footer