フォルダ(およびそのサブフォルダ)内のすべてのファイルを正規表現で検索して置換する必要があります。それを行うためのLinuxシェルコマンドは何でしょうか?sed beginner:フォルダ内のすべてのオカレンスを変更する
たとえば、すべてのファイルに対してこれを実行し、古いファイルを置き換えられた新しいテキストで上書きしたいとします。
sed 's/old text/new text/g'
フォルダ(およびそのサブフォルダ)内のすべてのファイルを正規表現で検索して置換する必要があります。それを行うためのLinuxシェルコマンドは何でしょうか?sed beginner:フォルダ内のすべてのオカレンスを変更する
たとえば、すべてのファイルに対してこれを実行し、古いファイルを置き換えられた新しいテキストで上書きしたいとします。
sed 's/old text/new text/g'
のみSED使用してそれを行うための方法はありません。あなたは一緒に、少なくともfindユーティリティを使用する必要があります:
find . -type f -exec sed -i.bak "s/foo/bar/g" {} \;
このコマンドが変更された各ファイルに対して.bak
ファイルを作成します。
注:
sed
コマンドの-i
引数はGNUの拡張であるので、あなたはBSDのsed
でこのコマンドを実行している場合は、名前を変更して新しいファイルに出力をリダイレクトする必要があります。それ。find
ユーティリティは古いUNIXボックスに-exec
引数を実装していないため、代わりに| xargs
を使用する必要があります。私は(あなたのファイルをバックアップした後に)示唆する:
find /the/folder -type f -exec sed -ibak 's/old/new/g' {} ';'
my mass search/replace Perl scriptとお試しください。連鎖ユーティリティソリューション(シェルメタキャラクター解釈の複数のレベルに対処する必要がないなど)に比べていくつかの利点があります。
移植性のために、私はLinuxまたはBSDに固有のsedの機能に依存しません。代わりに、私はUNIXプログラミング環境のKernighanとPikeの本のoverwrite
スクリプトを使用します。
コマンドは、その後
find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'
で、(私はすべての場所で使用)overwrite
スクリプトが
#!/bin/sh
# overwrite: copy standard input to output after EOF
# (final version)
# set -x
case $# in
0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac
file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15 # clean up files
if "[email protected]" >$new # collect input
then
cp $file $old # save original file
trap 'trap "" 1 2 15; cp $old $file # ignore signals
rm -f $new $old; exit 1' 1 2 15 # during restore
cp $new $file
else
echo "overwrite: $1 failed, $file unchanged" 1>&2
exit 1
fi
rm -f $new $old
アイデアですが、それは、コマンドが成功した場合にのみ、ファイルを上書きすることです。 find
に有用ともシェルがsed
前にファイルを切り捨てるので、あなたが
sed 's/old/new/g' file > file # THIS CODE DOES NOT WORK
を使用したくないだろうどこにそれを読むことができます。
find | xargs cmd
をfind -exec
よりも使用するほうが覚えやすいので、
この例では、世界的に現在のディレクトリで、以下.txtファイルで「バー」と「foo」を置き換えます。
find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/foo/bar/g"
あなたのファイル名がファンキーな文字が含まれていない場合-print0
と-0
オプションを省略することができますスペースなど。
あなたがOSXにしている場合は、見つける 'てみてください。 -type f -name "* .txt" -print0 | xargs -0 sed -i '' "s/foo/bar/g" '(空の文字列を' -i'引数に指定します)。 – jkukul
フォルダ内のファイル名に、通常の名前(file1、file2 ...など)がある場合、私はサイクルに使用しました。
for i in {1..10000..100}; do sed 'old\new\g' 'file'$i.xml > 'cfile'$i.xml; done
これは質問された質問とは関係ありません。質問には、同じファイル/フォルダ名のパターンについて何も言及していません。そのような回答は避けてください –
http://theunixshell.blogspot.com/2012/12/find-and-replace-string-in-all-files.html – Vijay