найти и заменить строку в файле - PullRequest
15 голосов
/ 14 декабря 2010

Я пытаюсь найти и заменить строку в папке файлов.

Может ли кто-нибудь мне помочь?

Мой сценарий выглядит следующим образом:

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

Теперь кажется, что это находит строку «Это a» и заменяет ее «Я есть», но это выводит только на экран.

Мне нужно заменить в самих файлах.

Спасибо

Ответы [ 4 ]

29 голосов
/ 14 декабря 2010

Используйте параметр -i для sed, чтобы внести изменения на месте:

sed -i "s/$OLD/$NEW/g" "$f"
    ^^
2 голосов
/ 14 декабря 2010

Вывод на экран (stdout) из-за следующего:

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

Попробуйте перенаправить на файл (следующее перенаправляет на новые файлы, а затем переименовывает его для перезаписи исходного файла):

sed "s/$OLD/$NEW/g" "$f" > "$f.new" && mv "$f.new" "$f"
0 голосов
/ 02 апреля 2014

Проверьте это

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

##############################################################
0 голосов
/ 14 декабря 2010

Это фрагмент кода, который я использую, он удаляет все содержимое между 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}' {} \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...