2013-10-30 30 views
0

我有以下形式如何指定在「或」 sed的

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

現在我想從文件中刪除所有的A,B,C以高效的方式爲數據的文件。我知道我可以使用SED的一個模式

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

但我怎麼這樣指定sed包含一個or來刪除所有的模式?

的預期結果是:

<Here> <There> 
<SomeMoreDate> <SomeOtherDate> 
+0

什麼是預期的產出? – devnull

+0

@devnull我在我的回答中指定了預期的輸出 –

回答

0

Ivaylo Strandjev的答案是正確的,因爲它解決了想問題時匹配單個字符。有一種方法雖然有或匹配較長的字符串。

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

你可以服用點狀嘗試:

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

可悲的是,sed需要所有這些反斜槓。有些如果使用-r可以避免這種情況。

+0

是的,它確實有字符串。您能否藉助一個小例子來說明這個問題 –

+0

@JannatArora,第二個代碼塊是一個例子,說明「stringBsomething」是如何變成「別的東西」的。我只是改進了這個例子以減少'(' – akostadinov

2

您可以使用sed -i 's/[ABC]//g' /path/to/filename[ABC]將匹配ABC。您可能會發現this reference有用。

+1

除非你說謊並且你的前綴不全是一個字符長;那麼,你不能使用一個字符類。修復很簡單,但不幸的是,不同的'sed'實現具有不同的語法。嘗試'%<\(A \ | B | \ C \)/%<%g',其中可能反斜槓必須在某些方言中刪除。 – tripleee

+1

另外,boo hiss用於鏈接到一個使用[Useless'cat's](http://partmaps.org/era/unix/award.html)的教程。 – tripleee

2

如果您使用GNU sed的,你可以說:

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

下面原本應該工作:

sed 's#A/##g;s#B/##g;s#C/##g' filename 
0
sed "s/<[ABC]\//</g" /path/to/filename 

,因爲它是1個長度變化的特殊情況。這不是一個真實的或

您可以使用此解決辦法上限於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 '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功能