2つの異なるファイルの文字列を1つのコマンドに置き換えることはできますか?

2つの異なるファイルの文字列を1つのコマンドに置き換えることはできますか?

いくつかのサブディレクトリがあるディレクトリがあります。たとえば、 「」*A*.txt*B*.txt含む2種類のファイルがあることを知っています。古い文字列「をそのディレクトリに入れます。そのディレクトリを」に置き換えたいです。新しい文字列1つのコマンドでこれを実行できますか?つまり、"*B*.txt"このコマンドのどこかに次を追加できます。

find . -type f -name "*A*.txt" -exec sed -i 's/oldString/newString/g' {} \;

答え1

あなたは試すことができます:

find . -type f \( -name "*A*.txt" -o -name "*B*.txt" \) \
  -exec sed -i 's/oldString/newString/g' {} +

(ここでは、ファイルごとに1つの呼び出しを実行しない+ように置き換えも使用されます。追加の利点は次のとおりです。;sedどの呼び出しがsedゼロ以外の終了状態で返されます。

答え2

それが本当ならただ一つ手紙、次のようにすることができます。

find . -type f -name "*[AB]*.txt" -exec sed -i 's/oldString/newString/g' {} \;

明確に言えば、これは単一の文字を一致として使用する場合にのみ機能します。

答え3

GNUがある場合は、代わりに次のことを行うfindことができます。-regex-name

find . -type -f -regextype egrep -regex "(.*A.*|.*B.*)\.txt" -exec sed -i 's/oldString/newString/g' {} \;

ノートパターンがファイルのディレクトリパスにも表示される場合は、正規表現を変更する必要があります(@StéphaneChazelasの説明に従って)。

-regex ".*(A|B)[^/]*\.txt"

/パターンの後に表示される項目はすべて除外されます。

以下を使用して、正規表現型が使用egrep可能かどうかを確認できます。

find -regextype help

関連情報