sed - 如何修改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)。
解决方案
这可能对您有用(GNU sed):
sed -E '/^KEY1/{:a;N;/\nKEY2/!s/(.*\n)/\1version1_/;ta;s/(.*\nversion)1/\12/}' file
不要使用范围,而是使用循环。收集 and 之间的行KEY1
并KEY2
插入version1_
到最后一行的前面,直到KEY2
遇到。2
然后在模式空间的1
最后一行替换。
推荐阅读
- c - 代码打印输出中的额外空间和计算错误
- c++ - 如何使用 C++ lambda 函数将字符串映射到向量
? - java - 如何使用弹簧数据更新对象
- c# - 将三元条件运算符更改为常规 if else 语句
- r - R 中带有 ggplot 的 PCA 成为基于颜色输入的 Wilkinson 点图/单位直方图
- arrays - 带有列表的数组重新分配段错误
- spring-boot-actuator - Spring Boot 执行器运行状况挂起
- android - ARCore 云锚点 - 未配置锚点托管
- jenkins - java.lang.NoSuchMethodError: 在步骤 [approveReceivedEvent,
- xamarin.forms - 如何将嵌套 BindableLayout.ItemsSource 中的项目索引绑定到 CommandParameter - Xamarin