【问题标题】:sed: replace a string in a text only if enclosed within quotessed:仅当包含在引号内时才替换文本中的字符串
【发布时间】:2018-02-14 02:23:57
【问题描述】:

只有当特定的字符序列属于引号内的字符串时,我才需要使用 sed 替换文本中的字符序列。

例如以下文字:

这是“movies.YouTube_id”列引用的 YouTube 视频。

应该这样转换:

这是“movies.you_tube_id”列引用的 YouTube 视频。

即仅当此类子字符串是包含在单引号 (') 内的字符串的一部分时,才将子字符串 "YouTube" 替换为 "you_tube",无论引号内的前导和/或尾随字符如何。

显然

sed -r "s/YouTube/you_tube/g"

不起作用,因为它在任何地方都将“YouTube”替换为“you_tube”,而不管引号如何。我可以使用哪个正则表达式来完成任务?

提前谢谢你。

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    使用 GNU sed:

    sed -E "s/('[^']*)YouTube([^']*')/\1you_tube\2/g" file
    

    输出:

    这是“movies.you_tube_id”列引用的 YouTube 视频。

    【讨论】:

      【解决方案2】:

      关注awk 可能对您有所帮助:

      awk '{sub(/\047movies.YouTube_id\047/,"\047movies.you_tube_id\047")} 1'   Input_file
      

      输出如下:

      This is a YouTube video referenced by the 'movies.you_tube_id' column.
      

      【讨论】:

        【解决方案3】:

        这是一个awk 解决方案:

        awk 'BEGIN{FS=OFS="\047"} {
        for (i=2; i<=NF; i+=2) gsub(/YouTube/, "you_tube", $i)} 1' file
        
        This is a YouTube video referenced by the 'movies.you_tube_id' column.
        

        Sinec 我们使用单引号作为字段分隔符,每个偶数字段都会给我们用单引号括起来的带引号的字符串。

        【讨论】:

          【解决方案4】:

          如果字符串不固定(不一样),则使用环顾高级正则表达式和

          perl -pe "s/(?<=')(:?\w+\.)?YouTube(?=_id')/you_tube/"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-11
            • 2020-06-12
            • 2019-08-24
            • 2021-10-31
            • 2014-01-18
            • 1970-01-01
            相关资源
            最近更新 更多