【问题标题】:Substitute a regex pattern using awk使用 awk 替换正则表达式模式
【发布时间】:2013-01-04 03:04:34
【问题描述】:

我正在尝试编写一个正则表达式来用空格替换文件中存在的一个或多个“+”符号。我尝试了以下方法:

 echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }'
 This this+++is+not++done

预期:

This this is not done

任何想法为什么这不起作用?

【问题讨论】:

    标签: regex linux awk


    【解决方案1】:

    使用gsub 进行全局替换:

    echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1'
    

    sub 函数只替换第一个匹配,替换所有匹配使用gsub。

    【讨论】:

    • 最后的1 是干什么用的?
    • @DrunkenPoney 最后的1 告诉AWK 在gsubed 之后打印出该行。您可以通过将打印语句显式添加到与gsub 相同的操作来避免它,例如{gsub(/\++/," "); print;}
    • 在powershell中你必须反斜杠双引号。
    【解决方案2】:

    或tr 命令:

    echo This++++this+++is+not++done | tr -s '+' ' '
    

    【讨论】:

    • -s 非常方便。为了简单起见,我会说这是更好的解决方案。
    • 谢谢!我发现tr 是一个非常被低估的命令。
    • 也比 awk 快,而且打字更少。
    【解决方案3】:

    惯用的 awk 解决方案就是将输入字段分隔符转换为输出分隔符:

    $ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1'
    This this is not done
    

    【讨论】:

      【解决方案4】:

      试试这个

      echo "This++++this+++is+not++done" | sed -re 's/(\+)+/ /g'

      【讨论】:

        【解决方案5】:

        你也可以使用sed。

        echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g'
        

        这匹配一个或多个+ 并将其替换为空格。

        【讨论】:

          【解决方案6】:

          对于这种情况,我推荐sed,它的替换功能强大且语法简短。

          解决方案sed:

          echo This++++this+++is+not++done | sed -En 's/\\++/ /gp'
          

          结果:

          This this is not done
          

          对于awk: 您必须使用gsub 函数进行全局行替换(不止一次替换)。 语法: gsub(regexp, replacement [, target])。 如果省略第三个参数,则$0 是目标。 目标必须是变量或数组元素。 gsub 在目标中工作,被替换覆盖目标。

          解决方法:

          echo This++++this+++is+not++done | awk 'gsub(/\\++/," ")
          

          结果:

          This this is not done
          

          【讨论】:

          • 您的 sed 示例失败,因为反斜杠未在单引号内删除。如果您使用了双引号(或删除了一个反斜杠),该示例将起作用。 awk 示例失败,因为没有尾随引号。我没有测试它是否会因为双反斜杠而失败。
          【解决方案7】:
          echo "This++++this+++is+not++done" | sed 's/++*/ /g'
          

          【讨论】:

          • 这回答了问题第一行中列出的任务。
          【解决方案8】:

          如果您可以访问计算机上的节点,则可以通过安装 rexreplace 来实现

          npm install -g regreplace
          

          然后运行

          rexreplace '\++' ' ' myfile.txt
          

          如果您在data 目录中有更多文件,您可以这样做

          rexreplace '\++' ' ' data/*.txt
          

          【讨论】:

          • 如果你比较npm的大小和awk的大小,tr和rexreplace的替换速度,那么你可能会明白这是在用炸弹打开一个螺母。
          • 将 npm 与 awk 进行比较是没有意义的。我假设您的意思是 rexreplace 的大小。使用 tr 速度肯定会更好。答案旨在为使用语法更容易掌握的工具提供便利。这让我想起了在引入 C 时的讨论,人们认为生成的代码与在汇编中生成的代码相比是混乱且缓慢的。
          • @mathiasrw 通常与大小或速度无关。它通常是关于依赖关系和维护一个可以在任何地方可靠地工作的小足迹。 awk 是一个相当小的系统实用程序,几乎已经安装在您遇到的每个发行版上。节点/npm 还没有。
          猜你喜欢
          • 2012-02-12
          • 1970-01-01
          • 2016-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2014-03-29
          相关资源
          最近更新 更多