私のシステム上のフォルダーに、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
。