sed コマンドのファイル名のスペース処理

sed コマンドのファイル名のスペース処理

en.json、、、en 1.json3つのファイルがありますen 2.json。いずれも以下の内容を含んでいます。

    {
      "ABC" : "/long_name",
      "DFG" : "/{long_name}"
    }

次のコマンドを実行してandABCに置き換えました。123DFG456

grep -El 'ABC|DFG' *.json | xargs  sed -ibak -e 's#ABC#123#g' -e 's#DFG#456#g'

テキストは次のエラーに置き換えられますがen.json失敗en 1.jsonします。en 2.json

sed: en: No such file or directory

何らかの理由でスペースが無視され、コマンドでこれを処理する方法がわかりません。

ベストアンサー1

見ている問題は、スペースが区切り文字で処理されることです。

簡単な例:

% echo a b | xargs ls
ls: cannot access a: No such file or directory
ls: cannot access b: No such file or directory

lsファイルとab

xargs代わりに、別の区切り文字を指定して使用する必要がありますgrep。最良の区切り文字はNUL文字(\ 0)です。これを行うには、-Zwithgrep-0withを使用できますxargs

だからあなたの命令は

grep -Z .... | xargs -0 ....

たとえば、

$ ls
en 1.json  en 2.json  en.json
$ grep -Z -El ABC *.json | xargs -0 sed -ibak -e 's/ABC/HHH/'
$ ls
en 1.json  en 1.jsonbak  en 2.json  en 2.jsonbak  en.json  en.jsonbak

3つのファイルが変更されたことがわかります(「bak」ファイルが生成されます)。

おすすめ記事