【问题标题】:Using sed to replace symbol after semicolon使用 sed 替换分号后的符号
【发布时间】:2021-11-19 16:53:39
【问题描述】:

尝试使用 sed 命令来更改分号后的单词,如下所示(fileGrades.txt):

Student;Grade;Comment;
Eric;1;None;
Smith;2;None;
Thomas;1;None;
Chad;3;Nice work;

现在使用 sed 命令应该找到 Eric 和 Chad 并将他们的等级都更改为 2,但保持其余部分不变。我正在考虑使用这种方法(见下文),但它不起作用,因为它不允许我使用分号来知道在哪里更改成绩。

sed -i 's/Chad;*/Chad;2/g' fileGrades.txt

我也尝试过使用 *、^ 和 . 等通配符的方法。 ,但是没有用。

【问题讨论】:

    标签: unix sed


    【解决方案1】:

    你可以使用

    sed -E -i 's/(Eric|Chad);[0-9]*/\1;2/g' fileGrades.txt
    

    详情

    • -E - POSIX ERE 已启用
    • -i - 输入文件的内容被修改
    • s/(Eric|Chad);[0-9]*/\1;2 - 匹配并捕获到组 1 (\1) EricChad,然后匹配 ; 和零个或多个数字,并将此匹配替换为组 1 值 ; 和 @987654331 @。

    online demo

    #!/bin/bash
    s='Student;Grade;Comment;
    Eric;1;None;
    Smith;2;None;
    Thomas;1;None;
    Chad;3;Nice work;'
    sed -E 's/(Eric|Chad);[0-9]*/\1;2/g' <<< "$s"
    

    输出:

    Student;Grade;Comment;
    Eric;2;None;
    Smith;2;None;
    Thomas;1;None;
    Chad;2;Nice work;
    

    【讨论】:

      【解决方案2】:

      这是为awk 量身定制的问题,请在您显示的示例案例中使用以下awk 代码。

      awk 'BEGIN{FS=OFS=";"} FNR==1{print;next} $1=="Eric" || $1=="Chad"{$2=2} 1' Input_file
      

      一旦您对上述代码的结果感到满意,然后尝试使用以下代码将输出保存到 Input_file 本身。

      awk 'BEGIN{FS=OFS=";"} FNR==1{print;next} $1=="Eric" || $1=="Chad"{$2=2} 1' Input_file > temp && mv temp Input_file
      

      【讨论】:

        猜你喜欢
        • 2013-03-19
        • 2018-01-15
        • 2021-04-30
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 2020-05-29
        • 2011-12-25
        • 1970-01-01
        相关资源
        最近更新 更多