заменить слова, используя grep и sed в оболочке - PullRequest
0 голосов
/ 17 сентября 2009

У меня есть около 150 файлов, и в них я хочу удалить следующий код:

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/height.js"></SCRIPT>

То, что я делаю, это:

sed -e 's/<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/height.js"></SCRIPT>/ /' file_names

Это не похоже на работу.

Я хочу удалить этот скрипт из всех файлов за один раз. Как я могу это сделать?

Ответы [ 4 ]

2 голосов
/ 17 сентября 2009

Вам нужно беспокоиться о косых чертах в заменяемом тексте.

  • Либо: используйте '\/' для каждой косой черты,
  • Или: обмануть и использовать '.', чтобы найти любой символ в точке, где должна появиться косая черта.

Альтернатива использует невероятность файла, содержащего HTML. Теоретически, если вам не нравится второй вариант, вы также должны использовать «\.» в каждой точке, где «.» появляется в строке, которую вы просматриваете.

sed -e 's/<SCRIPT LANGUAGE="JavaScript" TYPE="text.javascript" SRC=".height.js"><.SCRIPT>/ /' file_names

Это скопировано из вашего примера и косые черты заменены точками. Однако, указав все имена файлов в командной строке таким образом, вы просто запишите выходные данные как объединение всех отредактированных файлов в стандартный вывод.

Классически, чтобы редактировать файлы более или менее на месте, вы должны написать:

tmp=${TMPDIR:-/tmp}/xxx.$$
trap 'rm -f $tmp; exit 1' 0 1 2 3 13 15
for file in ...list...
do
    sed -e '...' $file > $tmp
    mv $tmp $file
done
rm -f $tmp
trap 0

Это включает в себя достаточно пуленепробиваемую очистку временного оборудования - оно не идеально. Этот вариант создает резервную копию оригинала, а затем заменяет его отредактированной версией:

tmp=${TMPDIR:-/tmp}/xxx.$$
trap 'rm -f $tmp; exit 1' 0 1 2 3 13 15
for file in ...list...
do
    sed -e '...' $file > $tmp
    mv $file $file.bak
    mv $tmp $file
done
rm -f $tmp
trap 0

В GNU sed вы можете использовать опцию '-i' или '--in-place' для перезаписи файлов; Вы можете использовать '--in-place=.bak' для создания резервных копий каждой file в file.bak.

1 голос
/ 17 сентября 2009

Вам нужно экранировать специальные символы с дополнительной обратной косой чертой.

Обратите внимание, что вывод также все пойдет на консоль. Если вам нужно 150 отдельных выходных файлов, вы можете посмотреть на команду xargs, например:

ls -1 | xargs -t -i 'sed -e -i "заменить комментарий" {}'

Имейте в виду, что опция sed '-i' будет редактировать файлы на месте, поэтому сначала сделайте правильную замену и сделайте резервную копию файлов!

0 голосов
/ 20 сентября 2009

Вам не нужно использовать / с командой s:

sed 's|old|new|' files...

Если вы хотите выполнить inline-replace, то сначала создайте резервную копию всех ваших файлов , затем выполните эту команду, заменив 'old' и 'new' строками на ваш выбор:

sed -i .bak 's|old|new|' files...

Поскольку встроенная замена очень опасна, я не могу особо подчеркнуть, что вы должны сделать резервную копию всех ваших файлов перед выполнением команды.

Я уже говорил, что вы должны сделать резервную копию всех ваших файлов ?

0 голосов
/ 17 сентября 2009

Вы должны передать вывод например,

sed -e 's/<.*SRC="\/height.js".*>//g' < foo.html > foo1.html
...