我有一个文件,其中包含以下形式的数据
<A/Here> <A/There>
<B/SomeMoreDate> <C/SomeOtherDate>
现在我想以有效的方式从文件中删除所有 A、B、C。我知道我可以将 sed 用于一种模式
sed -i 's/A//g' /path/to/filename.
但是我如何指定sed
包含一个or
to 删除所有模式?
预期的输出是:
<Here> <There>
<SomeMoreDate> <SomeOtherDate>
如果你使用的是 GNU sed,你可以说:
sed -r 's#(A|B|C)/##g' filename
否则,以下内容应该有效:
sed 's#A/##g;s#B/##g;s#C/##g' filename
您可以使用sed -i 's/[ABC]//g' /path/to/filename
. [ABC]
将匹配A
orB
或C
。您可能会发现此参考很有用。
sed "s/<[ABC]\//</g" /path/to/filename
因为它是模式中长度为 1 个字符的特殊情况。这不是真正的 OR
您可以在仅限于 POSIX sed 的情况下使用此解决方法
用于测试目的的样品
echo "<Pat1/ is pattern 2> <pat2/ is pattern 2>
<pAt3/ is pattern 3>
<pat4/ is pattern 4> but not avalaible for Pat1/ nor <pat2
" | \
sed 部分
sed 's/²/²o/g
t myor
:myor
s/<Pat1\//²p/g;t treat
s/<pat2\//²p/g;t treat
s/<pAt3\//²p/g;t treat
b continu
: treat
s/²p/</g
t myor
: continu
s/²o/²/g
'
这使用一个临时字符作为通用模式“²”和一系列 s/ 后跟一个测试分支作为 OR 功能
Ivaylo Strandjev 的回答是正确的,因为它解决了想要匹配单个字符时的问题。有一种方法可以拥有或匹配更长的字符串。
s/\(\(stringA\)\|\(stringB\)\|\(stringC\)\)something/something else/
您可以尝试使用类似的东西:
echo stringBsomething | sed -e 's/\(stringA\|stringB\|stringC\)something/something else/'
sed
需要所有这些反斜杠是可悲的。如果您使用-r
.