【问题标题】:How to remove string between two characters and before the first occurrence using sed如何使用 sed 删除两个字符之间和第一次出现之前的字符串
【发布时间】:2022-02-03 17:13:35
【问题描述】:

我想删除“:”和第一个“|”之间的字符串使用 sed。

输入: |abc:1.2.3|def|

sed 的输出: |abc|def|

我设法想出了 sed 's|\(:\)[^|]*|\1|',但是这个 sed 命令不会删除第一个字符(“:”)。如何修改此命令以同时删除冒号?

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    您不需要在您的模式中将: 分组并使用它来替代。

    你应该保持简单:

    s='|abc:1.2.3|def|'
    sed 's/:[^|]*//' <<< "$s"
    
    |abc|def|
    

    : 匹配冒号,[^|]* 匹配 0 个或多个非管道字符

    【讨论】:

      【解决方案2】:

      第一种解决方案:使用awk,您可以尝试关注awk 程序。

      awk 'match($0,/:[^|]*/){print substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH)}' Input_file
      

      解释: 使用awkmatch 函数,这里从: 匹配到直到第一次出现|。所以match 函数所做的是,每当其中匹配一个正则表达式时,它将为其名为RSTARTRLENGTH 的OOTB 变量设置值,因此基于此我们打印子字符串以忽略匹配的部分并打印其他一切都根据所要求的输出。



      第二个解决方案:在 GNU awk 中使用 FPAT 选项,尝试仅使用您显示的示例进行跟踪、编写和测试。

      awk -v FPAT=':[^|]*' '{print $1,$2}'  Input_file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 2021-11-16
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        相关资源
        最近更新 更多