バックスラッシュをsedに置き換える

バックスラッシュをsedに置き換える

私はC:\両方の異なる種類のファイルを/root

私の木は次のとおりです

- Batch
  - Place of the script
- Conf
  - Appli1
    - File1.xml
    - File2.xml
    - ...
  - Appli2
    - File1.xml
    - File2.xml
    - ...
  - ...
- Info
  - File1.conf
  - File2.conf
  - ...

私のスクリプトは次のとおりです/Batch

#/bin/bash
find ../ -name "*.xml" -o name "*.conf" -print | xargs sed -i 's C:\ /root/ g'

しかし、エラーがありますsed partcharacter 14: command 's' unfinished

なぜこれが起こるのですか?

ベストアンサー1

どこで使用しますか:

sed -i 's C:\ /root/ g'

あなたは使用していますs注文するコマンドのいくつかの部分をスペース文字で区切ることはまれですが、完全に有効です。ただし、区切り文字の前にバックスラッシュがある場合は、区切り文字として扱われず、パラメータ自体の一部として扱われます。

ここでの問題は、バックスラッシュがC:\中間の空白を超えているため、代替のs終わりが見つからず(現在ではg)見てわかるように、コマンドが完了していないと文句を言うことです。

少なくとも別のバックスラッシュを使用してバックスラッシュ自体をエスケープする必要があります。

sed -i 's C:\\ /root/ g'

スペースを別の文字に置き換える方がはっきりするかもしれませんが、これはうまくいきます。


あなたの用途に関してxargsとサブディレクトリ -xargsここでは必要ありません。findサブディレクトリのファイル処理を含め、これを直接実行できます。使用:

find ../ \( -name "*.xml" -o -name "*.conf" \) -exec sed -i -e 's|C:\\|/root/|g' '{}' +

findコマンドsed自体と見つかったすべてのファイル名を実行します。代わりにファイル名を挿入すると、コマンドの実行回数が最小限に抑え{}られます。+find

-execdir-execおそらく、説明されているいくつかのセキュリティ上の理由よりも良いでしょう。findマニュアルページ;非標準の拡張ですが、GNUツールを使用しているようなので、必要に応じてください。

おすすめ記事