查找并替换文件中的字符串

时间:2010-12-14 09:57:34

标签: 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 -f $f $BPATH
    sed "s/$OLD/$NEW/g" "$f"
   else
    echo "Error: Cannot read $f"
  fi
done

现在这似乎找到字符串'This is a'并替换为'我是',但这仅打印到屏幕。

我需要它来替换文件本身。

由于

4 个答案:

答案 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

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