![sed を使用して複数のファイルで文字列を検索および置換する [duplicate]](https://linux33.com/image/114902/sed%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%8A%E3%82%88%E3%81%B3%E7%BD%AE%E6%8F%9B%E3%81%99%E3%82%8B%20%5Bduplicate%5D.png)
検索と置換のために、既知の文字セットを含むファイルのリストをsedに渡そうとします。
複数の.xmlファイルを含むディレクトリの場合:
ls -la
file1.xml
file2.xml
file3.xml
それぞれは一致する文字列を含みます。
grep -i foo *
file1.xml <foo/>
file2.xml <foo/>
file3.xml <foo/>
fooをbarに置き換えるには、forループを使用してください。
for f in *.xml; do ls | sed -i "s|foo|bar|g" ; done
返品:
sed: no input files
sed: no input files
sed: no input files
私は効果的な選択肢を見つけたので、これは主に私自身のインスピレーションのためです。
find /dir/ -name '*.xml' -exec sed -i "s|foo|bar|g" {} \;
答え1
ループに欠陥がありますfor
。コマンドを削除しls
て$f
変数を引数として追加すると、sed -i
各変数は内部で編集されます。filename.xml
for f in *.xml; do sed -i "s|foo|bar|g" "$f"; done
答え2
GNU sedでは、複数のファイルをその場で編集することもできます。したがって、あなたの仕事は次のように縮小されます。
sed -i -se 's|foo|bar|g' *.xml
-s for --separate
sed
これを行うオプションです。
答え3
sed は入力パスを引数として期待します。したがって、次のように設定してみてください。
… | sed -i "…" /dev/stdin
(テストされていません)次の理由でファイルをパラメータとして使用する方が簡単です。
sed -i "..." *.xml