заменить определенный текст во всех файлах с помощью однострочной команды оболочки

У меня есть переименованный файл js, который я должен вызывать на каждой из моих php-страниц. Теперь я хочу заменить это старое имя новым с помощью оболочки. что я использую это:

sed -i ’s/old/new/g’ *

но это дает следующую ошибку:

sed: -e expression #1, char 1: unknown command:

Как я могу сделать эту замену?


person developer    schedule 26.03.2010    source источник


Ответы (8)


Вероятно, есть менее подробные решения, но начнем:

for i in *; do sed -i 's/old/new/g' "$i"; done

Имейте в виду, что это будет работать только на текущем уровне файловой системы, файлы в подкаталогах не будут изменены. Кроме того, вы можете заменить * на *.php или сделать резервные копии (передайте аргумент после -i, и он сделает резервную копию с заданным расширением).

person K. Norbert    schedule 26.03.2010
comment
в OSX у вас есть BSD sed, и вам нужно передать расширение файла для резервных копий в параметр -i. Посетите эту страницу. - person spectrum; 19.01.2019
comment
Я получаю sed: couldn't edit includes: not a regular file для многих папок. - person Black; 01.07.2019
comment
Я предполагаю, что это FIFO или файлы устройств, или что-то другое, кроме обычного файла. Если у вас есть нестандартные файлы, вам придется использовать что-то другое вместо glob (например, find -type f...). - person K. Norbert; 01.07.2019

sed -i.bak 's/old/new/g' *.php

сделать это рекурсивно

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +;
person ghostdog74    schedule 26.03.2010
comment
@WimPruiksma, я получаю ту же ошибку от BSD sed на Mac, но не от GNU sed (установленного как gsed с brew). - person DaCheetah; 19.03.2018
comment
sed -i не требует стандарта POSIX, поэтому его нет в OS X или BSD iirc. - person Wyatt Ward; 02.05.2018
comment
FTR: я только что заменил на sed и FreeBSD 11.3, используя sed -i '' -e '...', как описано в ответах на заголовок stackoverflow.com/questions/12696125/sed-edit-file-in-place - person Piohen; 23.07.2020

это очень просто, без цикла for или и заботится о любом количестве или вложенных каталогах

grep -rl 'oldText' [folderName-optional] | xargs sed -i 's/oldText/newText/g'

person Community    schedule 30.10.2017
comment
Я получаю No such file or directory с этим и рекурсивными каталогами. - person dman; 06.11.2018
comment
@dman, вероятно, вы выполнили его с [имя папки-необязательно], не меняя его. вы можете удалить его или оставить только одну точку без кавычек grep -rl 'oldText' . | xargs sed -i 's/oldText/newText/g' - person ; 06.11.2018

Вы используете апострофы Unicode (ПРАВАЯ ОДИНАРНАЯ КАТЫЧКА — U2019) вместо апострофов ASCII (0x27) вокруг аргумента команды sed.

person Dennis Williamson    schedule 26.03.2010

Я знаю, что я действительно опаздываю, но все же:

find . -type f -name "*.php"|xargs sed -i 's/old/new/g'
person Ziyad    schedule 19.11.2018
comment
Лучший ответ здесь. - person VAdaihiep; 18.02.2019

Для полноты предоставьте совместимую с OSX версию приведенного выше принятого ответа (чтобы ответить на комментарий от @jamescampbell)

for i in *.php; do sed -i .orig 's/old/new/g' "$i"; done

Эта команда создает .orig файлов резервных копий.

person shiramy    schedule 21.08.2018

Попробуй это:

ls | grep "php" > files.txt
for file in $(cat files.txt); do
    sed 's/catch/send/g' $file > TMPfile.php && mv TMPfile.php $file
done
person lugte098    schedule 26.03.2010
comment
Не знаю о бесполезности - но это очень уродливый подход, а затем тот факт, что использование фиксированного имени временного файла (files.txt, TMPfile.php) сломается, если будет какой-либо параллелизм. - person symcbean; 26.03.2010

person    schedule
comment
получил ошибку на OSX zsh: argument list too long: perl - person jamescampbell; 27.02.2018