2010-12-14 64 views
15

我試圖找到並替換文件夾中的字符串。找到並替換文件中的字符串

有人可能幫助我嗎?

我的腳本如下:

#!/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 

現在,這似乎找到字符串「這是一個」與「我是」,但這只是打印到屏幕代替。

我需要它來替換文件本身。

感謝

回答

26

使用-i選項sed,以使發生的變化:

sed -i "s/$OLD/$NEW/g" "$f" 
    ^^ 
+0

工作很好!我知道我錯過了什麼。謝謝 – terrid25 2010-12-14 10:33:56

+0

好的,有沒有簡單的方法來修改我的shell腳本,以便它將檢查子文件夾?/home/user/test/xyz? – terrid25 2010-12-14 10:43:36

+0

#!bin/bash OLD =「這是一個」 NEW =「我是」 BPATH =「/ home/user/backup/foo」 find。 -name'* .shtml'-type f | 同時讀取文件名 做 /斌/ CP -f $文件名$ BPATH 使用sed -i 「S/$ OLD/$ NEW/G」 $文件名 做 – terrid25 2010-12-14 11:28:11

2

輸出變爲屏幕(stdout)由於下列原因:

sed "s/$OLD/$NEW/g" "$f" 

嘗試重定向到一個文件(以下重定向到一個新的文件,然後重命名爲覆蓋原文件):

sed "s/$OLD/$NEW/g" "$f" > "$f.new" && mv "$f.new" "$f" 
+0

創建一個.text.new文件和原始文件example.txt i被覆蓋並且是空白的。任何想法爲什麼? – terrid25 2010-12-14 10:32:53

+0

@ user390426:可能是因爲aix沒有引用變量'「$ f.new」'(兩個地方)和'「$ f」'。另外,'mv'不應該是無條件的。相反,它應該是'sed ... && mv ...'。 – 2010-12-14 11:07:00

+0

@丹尼斯感謝您的建議。我編輯了這篇文章。 – NPE 2010-12-14 11:26:05

0

這是一個片段我使用,它消除APA和BEPA之間的所有東西(多行,其中包括去除APA,BEPA)我n個電流目錄下的所有文件,排除的.svn目錄

find . \! -path '*.svn*' -type f -exec sed -i -n '1h;1!H;${;g;s/APA[ \t\r\n]*BEPA//g;p}' {} \; 
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 

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