使用 sed (GNU sed) 4.2.2,我想要:
- 匹配
Line1
- 检查
Line2
下面Line1
是否等于String
- 如果没有 - 追加到
String
后面Line1
(或者插入到前面Line2
)
我尝试过的:
echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'
但它返回:
行 1
字符串 行
2
字符串
行 3
我也尝试过:
echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'
但它又回来了
sed:-e 表达式 #1,字符 0:不匹配“{”
我知道如何用另一种方式做到这一点,也使用 sed,但我试图了解如何以上面描述的确切方式实现它。另外,请告诉我我的代码有什么问题。
答案1
尝试:
sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
局限性: 如果Line1
连续出现两行,这可能会或可能不会实现您想要的效果。
例子
让我们考虑这个测试文件:
$ cat file
Line1
String
Line2
String
Line3
Line1
Line2
现在,让我们应用命令:
$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2
怎么运行的
Line1/{...}
仅当当前行与正则表达式匹配时,才会执行花括号中的命令
Line1
。N
这将读入下一行并将其附加到当前行,两行之间用换行符分隔。
/\nString$/b
如果第二行与正则表达式匹配
\nString$
,则跳过其余命令(“branch”,b
)。s/\n/\nString\n/
这会将第一行和第二行之间的换行符替换为一个换行符加
String
另一个换行符。