Sed 如果双条件匹配,如何替换字符串
如果行包含Sed 如果双条件匹配,如何替换字符串,sed,Sed,如果行包含abc,则有一个命令将bbb替换为ccc echo "abc yyy bbb xzy" | sed -e "/abc/ s/bbb/ccc/" 如果我想进行替换,只有当该行同时包含abc和xyz时,有人知道该命令是什么吗 因为先匹配哪一个并不重要,所以您可以先查找abc,然后进行替换,如果也xyzmatches1: 或者,相当不优雅: sed '/abc.*xyz\|xyz.*abc/s/bbb/ccc/' 但是没有筑巢 1BSD sed在右大括号前需要一个分号。因为先匹配哪一个并
abc
,则有一个命令将bbb
替换为ccc
echo "abc yyy bbb xzy" | sed -e "/abc/ s/bbb/ccc/"
如果我想进行替换,只有当该行同时包含
abc
和xyz
时,有人知道该命令是什么吗 因为先匹配哪一个并不重要,所以您可以先查找abc
,然后进行替换,如果也xyz
matches1:
或者,相当不优雅:
sed '/abc.*xyz\|xyz.*abc/s/bbb/ccc/'
但是没有筑巢
1BSD sed在右大括号前需要一个分号。因为先匹配哪一个并不重要,所以您可以先查找
abc
,然后在xyz
匹配时进行替换1:
或者,相当不优雅:
sed '/abc.*xyz\|xyz.*abc/s/bbb/ccc/'
但是没有筑巢
1BSD sed需要在右大括号前加一个分号。只需使用awk,您可以按照编写的方式对其进行编码,在以下条件之间使用
&&
:
awk '/abc/ && /xyz/ { sub(/bbb/,"ccc") } 1'
试着写:
awk '(/abc/ && /xyz/) || (/def/ && (/ghi/ || /klm/)) { sub(/bbb/,"ccc") } 1'
或任何其他更有趣的sed复合条件。Awk在sed所在的任何地方都可以使用,并且上述功能是完全可移植的,在每个UNIX安装中都可以像在每个Awk中一样工作。只需使用Awk,您就可以按照编写的方式对其进行编码,在以下条件之间使用
&
:
awk '/abc/ && /xyz/ { sub(/bbb/,"ccc") } 1'
试着写:
awk '(/abc/ && /xyz/) || (/def/ && (/ghi/ || /klm/)) { sub(/bbb/,"ccc") } 1'
或任何其他更有趣的sed复合条件。Awk在sed所在的任何地方都可以使用,并且上面的内容是完全可移植的,并且在每个UNIX安装中都可以像在每个Awk中一样工作。对于您的特定示例,它将是
sed'/^abc.*xyz$/{s/bbb/ccc/}
或者如果您喜欢嵌套条件sed'/abc/{/xyz s/bbb/ccc/}“
。首选第二个:将匹配xyz abc bbb
——对于您的特定样本,第一个将是sed'/^abc.*xyz$/{s/bbb/ccc/}”
或者如果您更喜欢嵌套条件sed'/abc/{/xyz/{s/bbb/ccc/}”“
。首选第二个:将匹配xyz abc bbb
——第一个将对您所写的内容感到满意;BSDsed
(例如,可以在Mac OS X上找到)在}
之前的最后一个/
后面需要一个分号。这很有趣——尽管我认为它与POSIX规范一致。@JonathanLeffler我检查了:它使用新行显示并提到了这一点“历史上,sed
和}
编辑命令不允许在一行上使用作为命令分隔符的多个命令。支持此扩展的实现是允许的,但不是必需的。”BSD sed似乎将其解释为“在关闭大括号之前需要分号…@JonathanLeffler:您是如何在注释中使用emdash的<代码>&endash代码>和&emdash代码>不要为我工作。这肯定是沿着这些思路的东西。这是一个微小的区别,它抓住了那些主要使用GNUsed
的人,当他们移植到Mac或BSD时。GNUsed
对您所写的内容感到满意,这涵盖了大多数人。我忘记了Solaris、HP-UX、AIX所期望的——这是一个需要谨慎的领域。Mac键盘上的Option-Shift-下划线——它会生成em破折号;使用选项减号生成–一个短划线。从方便的em短划线或en短划线复制和粘贴页面上的文本也有效。另一个优势;它只使用允许的600个字符中的1个字符,而&mdash代码>使用7.GNUsed
会对你所写的感到满意;BSDsed
(例如,可以在Mac OS X上找到)在}
之前的最后一个/
后面需要一个分号。这很有趣——尽管我认为它与POSIX规范一致。@JonathanLeffler我检查了:它使用新行显示并提到了这一点“历史上,sed
和}
编辑命令不允许在一行上使用作为命令分隔符的多个命令。支持此扩展的实现是允许的,但不是必需的。”BSD sed似乎将其解释为“在关闭大括号之前需要分号…@JonathanLeffler:您是如何在注释中使用emdash的<代码>&endash代码>和&emdash代码>不要为我工作。这肯定是沿着这些思路的东西。这是一个微小的区别,它抓住了那些主要使用GNUsed
的人,当他们移植到Mac或BSD时。GNUsed
对您所写的内容感到满意,这涵盖了大多数人。我忘记了Solaris、HP-UX、AIX所期望的——这是一个需要谨慎的领域。Mac键盘上的Option-Shift-下划线——它会生成em破折号;使用选项减号生成–一个短划线。从方便的em短划线或en短划线复制和粘贴页面上的文本也有效。另一个优势;它只使用允许的600个字符中的1个字符,而&mdash代码>使用7。