我正在尝试查找并替换文件夹中的字符串。
有人可能会帮助我吗?
我的脚本如下:
#!/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'并替换为'我是',但这仅打印到屏幕。
我需要它来替换文件本身。
由于
答案 0 :(得分:29)
使用-i
的{{1}}选项进行更改:
sed
答案 1 :(得分:2)
由于以下原因,输出进入屏幕(stdout
):
sed "s/$OLD/$NEW/g" "$f"
尝试重定向到文件(以下重定向到新文件,然后重命名为覆盖原始文件):
sed "s/$OLD/$NEW/g" "$f" > "$f.new" && mv "$f.new" "$f"
答案 2 :(得分:0)
这是我使用的一个片段,它删除当前目录下所有文件中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}' {} \;
答案 3 :(得分:0)
检查出来
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
##############################################################