3

我想做以下替换

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 运行,我仅在行中删除新替换)print("""行。我想知道是否可以一次性完成,所以这不是我正在寻找的答案。

4

3 回答 3

3

您可以使用它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(".*[^)]$匹配带有 test from 的行,最后print("带有非)字符。&)位于匹配模式的末尾)

于 2021-01-18T17:16:01.930 回答
1

使用 GNU sed,您可以使用

sed '/print("""/!{/print("/s/$/)/}' file > newfile

请参阅在线演示

详情

  • /print("""/!- 如果print("""找到,则跳过该行
  • {/print("/s/$/)/}- 否则,如果行包含print(",则将行尾替换为)
于 2021-01-18T17:04:51.477 回答
1

这就是你想要做的吗?

$ 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")

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

于 2021-01-18T19:10:02.140 回答