フォルダ内のファイル内の用語の出現箇所をすべて置換します

フォルダ内のファイル内の用語の出現箇所をすべて置換します

私のシステム上のフォルダーに、C++コンパイルしようとしているプロジェクトがあります。

このプロセスではC++、私のコンパイラ バージョンではサポートされていない慣用句がいくつか使用されています。特に、コード内ではデータ値が頻繁に使用されます'nullptr'

私がやりたいのは、nullptrのすべての出現を に置き換えることですNULL

VIM次のコマンドでこれを実行できます:

:%s/nullptr/NULL/g 

各ファイルを開いてコマンドを実行せずに、ディレクトリ内のすべてのファイルに対してこれを一度に実行するにはどうすればよいですか?

答え1

for file in /path/to/dir/*; do
  sed -i s/nullptr/NULL/g "$file"
done

ただし、これはサブディレクトリには影響しません。

編集1

より高速なソリューション(GNU を使用):

find /path/to/dir -type f -print0 | xargs -0 sed -i s/nullptr/NULL/g

これはサブディレクトリ (およびドットファイル) にも影響します。-maxdepth 1それが不要な場合は追加してください。

答え2

これを行うには 2 つの方法があります。

ヴィム

次のようにしてコマンドラインから vim を使用できます。

$ vim -c "%s/nullptr/NULL/g|wq" foo.txt

for ループで囲みます:

$ for i in *; do vim -c "%s/nullptr/NULL/g|wq" -- "$i"; done

パール

$ perl -p -i -e 's/nullptr/NULL/g' foo.txt

for ループで囲みます:

$ for i in *; do perl -p -i -e 's/nullptr/NULL/g' -- "$i"; done

あるいは単純に:

$ perl -p -i -e 's/nullptr/NULL/g' -- *

答え3

GNU ツールを使用する場合:

grep -rlZ nullptr /path/to/dir |
  xargs -r0 sed -i s/nullptr/NULL/g

すべてのファイルを書き換える必要がないようにするため。

を使用する場合、常にsed -i、リンク (ハードリンクとソフトリンク) が壊れる、ファイルの所有権と許可が変更される、ファイルのスパース性やその他の一般的でない属性が変更される可能性があることに留意してください。また、 よりgrep前のバージョンの GNU では、2.12でディレクトリ ツリーを下るときにシンボリック リンクをたどることにも注意してください-r

関連情報