web-dev-qa-db-ja.com

検索パターンでsedを使用してxargsを使用する方法

コマンドの出力をsedの検索パターンとして使用する必要があります。エコーを使用して例を作成しますが、これはより複雑なコマンドになる可能性があると想定します。

echo "some pattern" | xargs sed -i 's/{}/replacement/g' file.txt

「一部のパターン」には空白があるため、このコマンドは機能しませんが、問題を明確に示していると思います。

そのコマンドを機能させるにはどうすればよいですか?

前もって感謝します、

16
Neuquino

代わりにコマンド置換を使用すると、例は次のようになります。

sed -i "s/$(echo "some pattern")/replacement/g" file.txt

二重引用符を使用すると、スペースが分割されないようにしながら、コマンド置換が機能します。

5
Steve

-Iスイッチで何を置き換えるかをxargsに指示する必要があります-少なくとも一部のバージョンでは、{}について自動的に認識していないようです。

echo "pattern" | xargs -I '{}' sed -i 's/{}/replacement/g' file.txt
20
Weetu

これはLinuxで動作します(テスト済み):

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g' 
7
alex

これはあなたのために働くかもしれません(GNU sed):

echo "some pattern" | sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

基本的にsome patternをsed置換コマンドに変換し、パイプを介して別のsed呼び出しにフィードします。最後のsed呼び出しは、ファイルを介してsedコマンドを受け入れる-fスイッチを使用します。この場合、ファイルは標準入力-です。

Bashを使用している場合は、here-stringを使用できます。

<<<"some pattern" sed 's|.*|s/&/replacement/g|' | sed -f - -i file.txt

N.B. sedセパレータ|および/some patternの一部であってはなりません。そうでない場合、正規表現が適切に形成されません。

0
potong