Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed 如果双条件匹配,如何替换字符串_Sed - Fatal编程技术网

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
——第一个将对您所写的内容感到满意;BSD
sed
(例如,可以在Mac OS X上找到)在
}
之前的最后一个
/
后面需要一个分号。这很有趣——尽管我认为它与POSIX规范一致。@JonathanLeffler我检查了:它使用新行显示并提到了这一点“历史上,sed
}
编辑命令不允许在一行上使用作为命令分隔符的多个命令。支持此扩展的实现是允许的,但不是必需的。”BSD sed似乎将其解释为“在关闭大括号之前需要分号…@JonathanLeffler:您是如何在注释中使用emdash的<代码>&endash
&emdash不要为我工作。这肯定是沿着这些思路的东西。这是一个微小的区别,它抓住了那些主要使用GNU
sed
的人,当他们移植到Mac或BSD时。GNU
sed
对您所写的内容感到满意,这涵盖了大多数人。我忘记了Solaris、HP-UX、AIX所期望的——这是一个需要谨慎的领域。Mac键盘上的Option-Shift-下划线——它会生成em破折号;使用选项减号生成–一个短划线。从方便的em短划线或en短划线复制和粘贴页面上的文本也有效。另一个优势;它只使用允许的600个字符中的1个字符,而
&mdash使用7.GNU
sed
会对你所写的感到满意;BSD
sed
(例如,可以在Mac OS X上找到)在
}
之前的最后一个
/
后面需要一个分号。这很有趣——尽管我认为它与POSIX规范一致。@JonathanLeffler我检查了:它使用新行显示并提到了这一点“历史上,sed
}
编辑命令不允许在一行上使用作为命令分隔符的多个命令。支持此扩展的实现是允许的,但不是必需的。”BSD sed似乎将其解释为“在关闭大括号之前需要分号…@JonathanLeffler:您是如何在注释中使用emdash的<代码>&endash
&emdash不要为我工作。这肯定是沿着这些思路的东西。这是一个微小的区别,它抓住了那些主要使用GNU
sed
的人,当他们移植到Mac或BSD时。GNU
sed
对您所写的内容感到满意,这涵盖了大多数人。我忘记了Solaris、HP-UX、AIX所期望的——这是一个需要谨慎的领域。Mac键盘上的Option-Shift-下划线——它会生成em破折号;使用选项减号生成–一个短划线。从方便的em短划线或en短划线复制和粘贴页面上的文本也有效。另一个优势;它只使用允许的600个字符中的1个字符,而
&mdash使用7。