SED
on を使用して、ある行を別の行に置き換えようとしていましたMAC OS X Terminal
。ディレクトリ内にあるすべてのファイルの行を別の行に置き換える必要があるシナリオがあります。両方の行は複雑で、異なる特殊文字と記号が含まれています。
どうすれば交換できますか?
交換する必要がある
import { wait } from 'path/and-child-path'
と
import { wait } from 'path/path/and-child-path'
私がやろうとしていたのは
find . -type f | xargs sed -i '' "s@import { wait } from 'path/and-child-path'@import { wait } from 'path/and-child-path'@g"
うまくいきません。助けてください。
答え1
あなたsed
が提供した には、まったく同じ一致および置換パターンがあります (タイプミスではなかった場合)。そのため、ファイルに変更が加えられることは期待できません。また、ビットは''
そこに存在すべきではありません。
これらの点を修正すると、だろうで終わる
find . -type f | xargs sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g"
そのコードはそれでも失敗するだろう一般的なケースでは、ファイル名にはスペース文字 (さらには改行文字も!) が含まれる可能性があり、これらがまさにxargs
区切り文字として使用されるからです。したがって、ファイル がある場合A X
、はファイルおよびsed
に対して動作するように指示されます。A
X
-exec
オプションは問題を直接的に解決します:
find . -maxdepth 1 -type f -exec sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g" {} +
も追加したことに注意してください-maxdepth 1
。そうしないと、find
サブディレクトリにも降りてしまいます。