sed 将两个搜索条件应用于一行,然后替换

问题描述

我想做以下替换

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(",则将行尾替换为 )

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...