ファイルのフォルダー内の文字列を検索して置換しようとしています。
誰かが私を助けてくれませんか?
私のスクリプトは次のとおりです:
#!/bin/bash
OLD="This is a"
NEW="I am a"
DPATH="/home/user/test/*.txt"
BPATH="/home/user/test/backup/foo"
[ ! -d $BPATH ] && mkdir -p $BPATH || :
for f in $DPATH
do
if [ -f $f -a -r $f ]; then
/bin/cp -f $f $BPATH
sed "s/$OLD/$NEW/g" "$f"
else
echo "Error: Cannot read $f"
fi
done
これで文字列「This is a」が見つかり、「I am a」に置き換わりますが、これは画面にのみ表示されます。
ファイル自体を置き換える必要があります。
ありがとう
使用 -i
sed
のオプションを使用して、変更を適切に行います。
sed -i "s/$OLD/$NEW/g" "$f"
^^
次の理由により、出力は画面(stdout
)に送られます。
sed "s/$OLD/$NEW/g" "$f"
ファイルにリダイレクトしてみてください(次のコマンドは新しいファイルにリダイレクトし、名前を変更して元のファイルを上書きします)。
sed "s/$OLD/$NEW/g" "$f" > "$f.new" && mv "$f.new" "$f"
これをチェック
http://cs.boisestate.edu/~amit/teaching/handouts/cs-unix/node130.html
##########################################################
\#!/bin/sh
\# sed/changeword
prog=`basename $0`
case $# in
0|1) echo 'Usage:' $prog '<old string> <new string>'; exit 1;;
esac
old=$1
new=$2
for f in *
do
if test "$f" != "$prog"
then
if test -f "$f"
then
sed "s/$old/$new/g" $f > $f.new
mv $f $f.orig
mv $f.new $f
echo $f done
fi
fi
done
##############################################################
これは私が使用するスニペットです。現在のディレクトリの下のすべてのファイルで、APAとBEPAの間のすべてのもの(APA、BEPAの削除を含む複数行にわたって)を削除し、.svnディレクトリを除外します
find . \! -path '*.svn*' -type f -exec sed -i -n '1h;1!H;${;g;s/APA[ \t\r\n]*BEPA//g;p}' {} \;