2013-02-11 16 views
11

私はbootsという名前のパッケージのすべての参照を設定ファイルに置き換えようとしています。ブールOR sed正規表現

add fast pkg boots-5.0 

私が試した次sedコマンド:

add fast package boots-2.3 
add fast pkg boots-4.5 

私はそれを交換したい:

sed -e 's/add fast (pkg\|package) boots-.*/add yinst pkg boots-5.0/g' 
sed -e 's/add fast [pkg\|package] boots-.*/add yinst pkg boots-5.0/g' 

は何

ラインの形式は例えば、add fast (package OR pkg) boots-(any-other-text)です正しい正規表現ですか?私はブール値または(packageまたはpkg)部分に何かがないと思う。

答えて

19
sed -e 's/add fast \(pkg\|package\) boots-.*/add yinst pkg boots-5.0/g' 

あなたは常に二回

sed 's/add fast pkg boots-.*/add yinst pkg boots-5.0/g 
s/add fast package boots-.*/add yinst pkg boots-5.0/g' 
+1

"twice"コマンドでセミコロンを使用する方が良いです。このように: 'sed 's/\。ism/\。ism \ .md5/g; s/\ .usp/\ .usp \ .md5/g'/tmp/verify' –

+0

@EvgeniyYablokov何か特別な理由はありますか?おそらく短いスクリプト(このようなもの)にはポイントがあるかもしれませんが、私はまだ2行バージョンが読みやすいと思っています。 – bobbogo

+0

私は@EvgeniyYablokovとして働かなければならないWindows上でGNU-utilsバージョンを使用していますが、これはセミコロンで動作するように提案されています。 – user1167442

7

BREとEREを混在させている場合は、()|のいずれかまたは両方をエスケープしてください。

sedはデフォルトで基本正規表現を使用します。拡張正規表現を使用できるようにするのは実装に依存します。 BSD sedで-Eスイッチを使用すると、GNU sedは-rと文書化されていますが、-Eも同様に動作します。

14

使用拡張正規表現モードを、それを実行してORを避けることができ、かつ|をエスケープしないでください。

sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g' 
+0

'sed:無効なオプション - E'。 Red Hatの 'GNU sed version 4.1.5'では動作しないようです。 –

+2

@AdamMatan Ah、Thorが示すようにGNU sedに '-r'フラグを使います。 –

0

GNU(Linuxの):

1)@のようにGNUで論理演算子を使用するための-rとsedの空白

2)にランダムな文字列

cidr="192.168.1.12" 
    cidr="192.168.1.12/32" 
    cidr="192.168.1.12,8.8.8.8" 

以下くださいThorが言及し、-iはその場でファイルを編集して一致するファイルを編集します。

$ echo '<user id="1000" cidr="192.168.1.12">' > /tmp/1000.xml 
$ sed -r -i \ 
    s/'cidr="192.168.1.12\/32"|cidr="192.168.1.12"|192.168.1.12,'/''/ /tmp/1000.xml 

-r = GNU sed 
-i = search/match/ edit the changes to the file on the fly