File 查找并替换文件中的字符串
我正在尝试查找并替换文件文件夹中的字符串 有人能帮我吗 我的脚本如下:File 查找并替换文件中的字符串,file,shell,scripting,replace,File,Shell,Scripting,Replace,我正在尝试查找并替换文件文件夹中的字符串 有人能帮我吗 我的脚本如下: #!/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
#!/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”,但这只打印到屏幕上
我需要它来替换文件本身
谢谢,由于以下原因,输出转到屏幕(stdout
):
sed "s/$OLD/$NEW/g" "$f"
尝试重定向到文件(以下重定向到新文件,然后重命名以覆盖原始文件):
这是我使用的一个片段,它删除当前目录下所有文件中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}' {} \;
使用
sed
的-i
选项进行适当的更改:
sed -i "s/$OLD/$NEW/g" "$f"
^^
看看这个
##########################################################
\#!/垃圾箱/垃圾箱
\#sed/转换词
prog=`basename$0`
案例$#in
0 | 1)echo'用法:'$prog';出口1;;
以撒
旧=1美元
新=2美元
为f英寸*
做
如果测试“$f”!=“$prog”
然后
如果测试-f“$f”
然后
sed“s/$old/$new/g”$f>$f.new
mv$f$f.orig
mv$f.新的$f
echo$f完成
fi
fi
完成
##############################################################
创建一个.text.new文件,原始文件example.txt被覆盖为空。知道为什么吗?@user390426:可能是因为aix没有引用变量“$f.new”(两个位置)和“$f”。而且,
mv`不应该是无条件的。相反,它应该是sed…&&mv…
。好的,我现在将$OLD更改为URL,它返回一个错误:sed:无法打开文件ww.google.co.uk///g:没有这样的文件或目录“sed”命令似乎不喜欢URL的//部分。有没有办法克服这个问题?@user390426:更改sed
命令中的分隔符:“s |$OLD |$NEW | g”
。效果很好!我知道我错过了什么。谢谢,有没有一种简单的方法来修改我的shell脚本,以便它签入子文件夹/主页/用户/测试/xyz?#!bin/bash OLD=“这是一个”NEW=“我是一个”BPATH=“/home/user/backup/foo”查找-name'*.shtml'-type f | while read filename do/bin/cp-f$filename$BPATH sed-i“s/$OLD/$NEW/g”$filename done在尝试使用-i:sed:非法选项--i用法:sed[-n][e script f source u file][file…]@Dchris-i
选项不是完全可移植的,尽管大多数平台都以某种形式支持它。在*BSD(包括MacOS)上,您需要-i'
;如果您根本没有sed-i
,可以尝试perl-pi-e
,在那里可以在perl中逐字使用简单的sed
脚本,但是请注意正则表达式方言不同(您主要需要了解在某些地方如何添加或删除反斜杠)。
sed -i "s/$OLD/$NEW/g" "$f"
^^
##########################################################
\#!/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
##############################################################