0

我有一个文件,其中包含以下形式的数据

<A/Here>  <A/There>
<B/SomeMoreDate> <C/SomeOtherDate>

现在我想以有效的方式从文件中删除所有 A、B、C。我知道我可以将 sed 用于一种模式

sed -i 's/A//g' /path/to/filename.

但是我如何指定sed包含一个orto 删除所有模式?

预期的输出是:

<Here>  <There>
<SomeMoreDate> <SomeOtherDate>
4

4 回答 4

2

如果你使用的是 GNU sed,你可以说:

sed -r 's#(A|B|C)/##g' filename

否则,以下内容应该有效:

sed 's#A/##g;s#B/##g;s#C/##g' filename
于 2013-10-30T08:56:14.163 回答
2

您可以使用sed -i 's/[ABC]//g' /path/to/filename. [ABC]将匹配AorBC。您可能会发现此参考很有用。

于 2013-10-30T08:48:04.127 回答
0
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 功能

于 2013-10-30T12:24:59.300 回答
0

Ivaylo Strandjev 的回答是正确的,因为它解决了想要匹配单个字符时的问题。有一种方法可以拥有或匹配更长的字符串。

s/\(\(stringA\)\|\(stringB\)\|\(stringC\)\)something/something else/

您可以尝试使用类似的东西:

echo stringBsomething | sed -e 's/\(stringA\|stringB\|stringC\)something/something else/'

sed需要所有这些反斜杠是可悲的。如果您使用-r.

于 2013-10-30T09:00:45.687 回答