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

Regex sed对一行应用两个搜索条件,然后替换,regex,sed,logical-operators,logical-and,Regex,Sed,Logical Operators,Logical And,我想做以下工作 sed 's/$/)/' python2.py 条件是一行包含print(),但不能包含print(“”) 应该而不是匹配的行将是 print("""Some multi line text etc... 而像这样的线应该是匹配的 print("Some single line text" 现在很容易匹配一个或排除另一个,但我无法将这两个条件组合到一个命令中 sed -ne '/print(/s/$/)/p' python

我想做以下工作

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(“
”)跳过所有行

sed -ne /print("""/! s/$/)/p python2.py
但这包括所有其他行,即使是那些没有打印()的行。是否有任何方法组合这两个条件,以便只有当两个条件都适用于一行时,才应用子条件

请注意:


我知道我可以执行两次sed运行,首先替换所有
打印(
行),然后执行第二次sed运行,删除新替换的
仅在
打印(““”
行。我想知道是否有可能一次性完成,因此这不是我想要的答案。

使用GNU,您可以使用

sed'/print(“”“/!{/print(“/s/$/)/}”文件>新建文件

详情:

  • /print(“/!
    )-如果找到
    print(“
    ”),请跳过该行
  • {/print(/s/$/)/}
    -否则,如果行包含
    print(
    ),请将行尾替换为

您可以使用此
sed
忽略已经有结束符的行

cat文件
打印(“”一些多行文本等。。。
打印(“一些单行文本”
打印(“某些单”行文本)
打印(“某些单行文本”)
sed'/print(“”/!s/print(“.[^)]$/&)/”文件
打印(“”一些多行文本等。。。
打印(“某些单行文本”)
打印(“一些单行文本”)
打印(“某些单行文本”)

模式
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")

如果没有,请编辑您的问题,以显示更具代表性的示例输入/输出,其中包括不适用的情况。

如果一行已经打印了(“一些单行文本”),该怎么办
在标准
sed
中也没有什么是很难做到的。一些
sed
方言会坚持在花括号之前或之后使用语句终止符。你可以通过将
更改为a
b
来避免这种情况,然后你就不需要花括号了。按预期工作。花括号语法是我缺少的。啊a、
sed'/print(“/b;/print(/s/$/)/”
也可以。