问题描述
我想做以下替换
sed 's/$/)/' python2.py
条件是一行包含 print(
但它可能不包含 print("""
。
它应该不匹配的一行是
print("""Some multi line text etc...
虽然应该匹配这样的行
print("Some single line text"
现在很容易匹配一个或排除另一个,但我无法将这两个条件组合成一个命令。例如
sed -ne '/print(/s/$/)/p' python2.py
匹配所有带有 print(
的行,但也匹配那些我想省略的行
print("""
。另一方面,我可以用 print("""
with
sed -ne /print("""/! s/$/)/p python2.py
但这包括所有其他行,即使是那些没有 print(
的行。有没有办法将这两个条件结合起来,以便仅当一行的两个条件都为真时才应用替换?
注意:
我知道我可以进行两次 sed 运行,首先对所有 print(
行进行替换,然后进行第二次 sed 运行,其中我仅在 {{ 1}} 行。我想知道是否可以一次性完成,所以这不是我正在寻找的答案。
解决方法
您可以使用此 sed
来忽略已经有结束 )
的行:
cat file
print("""Some multi line text etc...
print("Some single line text"
print("Some single ""line text"
print("Some single line text")
sed '/print("""/!s/print(".*[^)]$/&)/' file
print("""Some multi line text etc...
print("Some single line text")
print("Some single ""line text")
print("Some single line text")
模式 print(".*[^)]$
匹配来自 print("
的带有 test 的行,最后是非 )
字符。 &)
将 )
放在匹配模式的末尾。
这就是你想要做的吗?
$ cat file
print("""Some multi line text etc...
print("Some single line text"
$ sed 's/print("[^"].*/&)/' file
print("""Some multi line text etc...
print("Some single line text")
如果不是,那么请编辑您的问题以显示更真实的代表性示例输入/输出,其中包括这不起作用的情况。
,使用 GNU sed,您可以使用
sed '/print("""/!{/print("/s/$/)/}' file > newfile
参见online demo。
详情:
-
/print("""/!
- 如果找到print("""
,则跳过该行 -
{/print("/s/$/)/}
- 否则,如果行包含print("
,则将行尾替换为)
。