【问题标题】:sed replace character only between two known stringssed 仅在两个已知字符串之间替换字符
【发布时间】:2012-02-09 00:34:13
【问题描述】:

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

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'

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

【问题讨论】:

    标签: regex shell sed


    【解决方案1】:

    这可能对你有用:

    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
    

    【讨论】:

    • 完美,正是我所追求的。非常感谢这么快的回复,非常感谢!
    • 请解释第一部分!
    【解决方案2】:

    如果您愿意接受 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
    

    【讨论】:

    • 这也有效,非常感谢 awk 替代方案 - 我将尝试使用它以了解更多信息。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2020-12-29
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多