【问题标题】:sed command to substituite a value only in second line of occurrencesed 命令仅在出现的第二行替换一个值
【发布时间】:2023-03-14 14:01:02
【问题描述】:

sed 命令

如何在 Linux 中使用 sed 命令仅在第二行替换?

我正在尝试以下命令:

sed -i -e 's/GET:CNTR,01010005/GET:CNTR,01010006/2' -e 's/GET:CNTR,01010006/GET:CNTR,01010008/' /data0101/ee_stats.out

这似乎没有改变第二行的出现。

我需要改变:

GET:CNTR,01010005,eir,0,255;
GET:CNTR,01010005,eir,0,255;
GET:CNTR,01010006,eir,0,255;

到:

GET:CNTR,01010005,eir,0,255;
GET:CNTR,01010006,eir,0,255;
GET:CNTR,01010008,eir,0,255;

【问题讨论】:

  • “第二行出现”?在您的示例中,您更改 行。
  • [root@bteir data0101]# cat ht hello hello hallo [root@bteir data0101]# sed -i -e 's/hallo/hey/' -e 's/hello/hallo/2 ' /data0101/ht [root@bteir data0101]# cat ht hello hello hey [root@bteir data0101]# 这里我想把第二行的“hello”也改成“hallo”

标签: linux sed substitution


【解决方案1】:

通常情况下,ed 是比 sed 更好的选择来修改文件,因为这就是它最初的设计目的:

printf '%s\n' '/01010005/;/01010005/;.s/01010005/01010006/' w | ed -s /data0101/ee_stats.out

这组(相当丑陋,授予)命令集将找到包含 01010005 的第二行(根据需要调整 RE;我不想使用整行来保持简单)并将其替换为 01010006 ,然后w将更改的文件写回磁盘。

第一个/01010005/ 找到具有该模式的第一行,分号将当前行光标设置为它。第二个找到当前行之后的第一个匹配行(因此是第二个匹配),并将其设置为当前行。地址范围内的. 表示当前行,因此只有一行被修改(省略;. 将使用从第一个匹配开始到第二个匹配结束的范围内的行,同时更改两个匹配行;如果s/// 之前有多个地址,最后两个被视为一系列行)。

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed 'N;s/\(5,.*\n.*\)5,/\16,/;s/\(6,.*\n.*\)6,/\18,/;P;D' file
    

    添加以下行。

    如果第一行值在第二行中重复,则修改第二行。

    打印然后删除第一行并重复。

    注意D 删除模式空间中的第一行,如果模式空间不为空,则延迟 sed 循环对模式空间的隐式补充,即 sed 循环使用模式空间中剩余的内容,直到它拥有所有走了。

    【讨论】:

      【解决方案3】:

      我已经通过以下方法解决了这个问题。

      sed -i -e "/GET:CNTR,01010005/ {n; :a; /GET:CNTR,01010005/! {N; ba;}; s/GET:CNTR,01010005/GET:CNTR,01010006/; :b; n; $! bb}" /data0101/ee_stats.out
      sleep 5
      sed -i -e "/GET:CNTR,01010006/ {n; :a; /GET:CNTR,01010006/! {N; ba;}; s/GET:CNTR,01010006/GET:CNTR,01010008/; :b; n; $! bb}" /data0101/ee_stats.out
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-02
        • 2021-11-12
        • 2020-12-07
        • 1970-01-01
        • 2016-03-07
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多