Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 查找并替换文件中的字符串_File_Shell_Scripting_Replace - Fatal编程技术网

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

##############################################################