【问题标题】:How to modify second-to-last line inside a range in sed如何修改sed范围内的倒数第二行
【发布时间】:2019-08-26 08:32:35
【问题描述】:

在 sed 中,我对某个范围内的行进行了一些修改,但倒数第二行需要特殊修改,而其他行不需要。所以我的问题是如何检测范围内的倒数第二行?

我有这样的数据:

a,
b,
c,
KEY1,
d,
e,
f,
KEY2,
g,
h,
i,
...

实际上我只能为 KEY1 和 KEY2 之间的每一行加上“version1”:

a,
b,
c,
KEY1,
version1_d,
version1_e,
version1_f,
KEY2,
g,
h,
i,

我的代码:

echo "a, b, c, KEY1, d, e, f, KEY2, g, h, i," | tr " " "\n" | \
sed '
/KEY1/,/KEY2/ {
  /KEY1/ n
  $ s/.*/version2_&/
  /KEY2/! s/.*/version1_&/
}
'

我尝试在范围内使用“$”,但它搜索文件的真正最后一行。

我想得到:

a,
b,
c,
KEY1,
version1_d,
version1_e,
version2_f,
KEY2,
g,
h,
i,

也就是说,对字母“f”的不同修改,即范围 /KEY1/,/KEY2/ 的倒数第二行

我考虑过使用“N”并检查模式空间是否包含 'f,\nKEY2' 但是,如果范围内的行数是偶数(这在我的情况下是可能的)并且我没有也不知道怎么做 x)。

【问题讨论】:

    标签: sed range


    【解决方案1】:

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

    sed -E '/^KEY1/{:a;N;/\nKEY2/!s/(.*\n)/\1version1_/;ta;s/(.*\nversion)1/\12/}' file
    

    不要使用范围,而是使用循环。收集KEY1KEY2 之间的行,并在最后一行之前插入version1_,直到遇到KEY2。然后在模式空间的最后一行中用2 替换1

    【讨论】:

    • 谢谢!我对 sed 中的循环了解不多,但效果很好!
    【解决方案2】:

    在每个 UNIX 机器上的任何 shell 中使用任何 awk,并经过简单修改以对每个块执行您还想做的任何其他事情:

    $ cat tst.awk
    /KEY2/ {
        for ( lineNr=1; lineNr<=numLines; lineNr++ ) {
            print (lineNr == numLines ? "version2_" : "version1_") block[lineNr]
        }
        inBlock = numLines = 0
    }
    inBlock { block[++numLines]=$0; next }
    /KEY1/ { inBlock=1 }
    { print }
    
    $ awk -f tst.awk file
    a,
    b,
    c,
    KEY1,
    version1_d,
    version1_e,
    version2_f,
    KEY2,
    g,
    h,
    i,
    ...
    

    【讨论】:

    • 感谢您的回复,但 numLines 是我必须初始化的变量吗?因为 KEY1 和 KEY2 之间的行数在我要编辑的文件中不固定,所以需要另一个步骤来确定 numLines。
    • 是的,它是一个变量,不,你不必初始化它。该代码不假设 KEY1 和 KEY2 之间有多少行,它计算每个 KEY1 和 KEY2 对之间的行数,将这些行保存在由当前计算的它们之间的相对行号索引的数组中,然后当KEY2 是使用它计算的打印版本 1 或版本 2 的值找到的。尝试在 KEY1 和 KEY2 对之间使用不同数量的线。喜欢的可以在顶部添加{print "TRC", inBlock+0, numLines+0, $0}进行追踪。
    • 我忘记回复了,但谢谢你的解释,现在我更清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2015-09-04
    • 1970-01-01
    • 2014-06-16
    • 2011-09-10
    • 2015-12-13
    • 2018-06-24
    相关资源
    最近更新 更多