【问题标题】:using sed, remove only one character before number match使用 sed,在数字匹配之前只删除一个字符
【发布时间】:2020-10-28 10:34:12
【问题描述】:

我有一个像这样的文本文件:

text-text-text-7.7.1-text
text-text-text-text-1.2.4-text
text-text-1.2.4-text

我希望将数字前的字符替换为空格。所以预期的输出应该是

text-text-text 7.7.1-text
text-text-text-text 1.2.4-text
text-text 1.2.4-text

我将如何使用 sed 做到这一点?

我尝试过使用 sed -E 's/-/ /g' 但它用空格替换了所有 -

text text text 7.7.1 text
text text text text 1.2.4 text
text text 1.2.4 text

以及 sed -E 's/-[0-9]/ /g' 和输出如下所示:

text-text-text .7.1-text
text-text-text-text .2.4-text
text-text .2.4-text

我该如何解决这个问题?

【问题讨论】:

    标签: linux bash awk sed


    【解决方案1】:

    由于您只想一个应用该规则,因此不要使用最终的/g。并且要仅在后面有数字时应用替换,您应该将其包含在匹配规则中:

    sed 's/-\([0-9]\)/ \1/'
    

    由于您不希望替换实际数字,因此上述表达式将其捕获到 \(...\) 组中,并通过 \1 表达式重新插入。

    【讨论】:

      【解决方案2】:

      当您标记您的问题awk 时,这是gensub 的任务。让data.txt 成为你的文件名,然后你可以这样做:

      awk '// {print gensub(/-([0-9])/, " \\1", 1)}' data.txt
      

      得到输出:

      text-text-text 7.7.1-text
      text-text-text-text 1.2.4-text
      text-text 1.2.4-text
      

      这确实使用捕获组并在替换中引用它 - 就像@Thomas 回答并确实替换了第一次出现。值得注意的是,gensub 允许您轻松更改任何出现 - 如果您将 2 作为第三个参数,它将替换第二个出现等等。

      【讨论】:

        猜你喜欢
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 2021-03-28
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多