首页 > 解决方案 > 如何修改sed范围内的倒数第二行

问题描述

在 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)。

标签: sedrange

解决方案


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

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

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


推荐阅读