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
方言会坚持在花括号之前或之后使用语句终止符。你可以通过将!
更改为ab
来避免这种情况,然后你就不需要花括号了。按预期工作。花括号语法是我缺少的。啊a、 sed'/print(“/b;/print(/s/$/)/”
也可以。