2010-12-14 65 views
15

Tôi đang cố gắng tìm và thay thế một chuỗi trong một thư mục tệp.tìm và thay thế chuỗi trong một tệp

Ai đó có thể giúp tôi?

kịch bản của tôi là như sau:

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

Bây giờ điều này dường như để tìm chuỗi 'Đây là một' và thay thế với 'I am a', nhưng chỉ in này để sàng lọc.

Tôi cần nó để thay thế trong các tệp.

Cảm ơn

Trả lời

26

Sử dụng -i tùy chọn sed để làm cho những thay đổi ở vị trí:

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

Đã làm việc tuyệt vời! Tôi biết tôi đã bỏ lỡ một cái gì đó. Cảm ơn, – terrid25

+0

Ok, có một cách dễ dàng để sửa đổi kịch bản shell của tôi, để nó sẽ kiểm tra trong các thư mục con?/home/user/test/xyz? – terrid25

+0

#! Bin/bash OLD = "Đây là" MỚI = "Tôi là" BPATH = "/ home/user/backup/foo" tìm. tên '* .shtml' -type f | khi đọc tên tệp do /bin/cp -f $ filename $ BPATH sed -i "s/$ OLD/$ NEW/g" $ filename done – terrid25

2

Sản lượng đi vào màn hình (stdout) vì những điều sau đây:

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

Hãy thử chuyển hướng đến một tập tin (chuyển hướng sau để một tập tin mới và sau đó đổi tên nó để ghi đè lên bản gốc tệp):

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

Điều đó tạo tệp .text.new và tệp gốc, example.txt i được ghi đè và để trống. Bất kỳ ý tưởng tại sao? – terrid25

+0

@ user390426: Có thể do aix không trích dẫn các biến '" $ f.new "'(hai địa điểm) và' "$ f" '. Ngoài ra, 'mv' không nên vô điều kiện. Thay vào đó, nó phải là 'sed ... && mv ... '. –

+0

@Dennis Cảm ơn bạn đã đề xuất. Tôi đã chỉnh sửa bài đăng. – NPE

0

đây là đoạn trích tôi sử dụng, nó xóa mọi thứ giữa APA và BEPA (trên nhiều dòng, bao gồm xóa APA, BEPA) i n tất cả các file bên dưới thư mục hiện hành, loại trừ thư mục svn

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

Kiểm tra này ra

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 

############################################################## 
Các vấn đề liên quan