Подтвердить что ты не робот

Замените строку другой строкой во всех файлах ниже моего текущего каталога

Как заменить каждое вхождение строки другой строкой ниже моего текущего каталога?

Пример: Я хочу заменить каждое вхождение www.fubar.com на www.fubar.ftw.com в каждом файле в моем текущем каталоге.

Из исследований до сих пор я придумал

sed -i 's/www.fubar.com/www.fubar.ftw.com/g' *.php
4b9b3361

Ответ 1

Вы на правильном пути, используйте find для поиска файлов, затем sed для их редактирования, например:

find . -name '*.php' -exec sed -i 's/www.fubar.com/www.fubar.ftw.com/g' {} \;

Примечания

  • . означает текущий каталог - то есть в этом случае выполните поиск в и ниже текущего каталога.
  • Для некоторых версий sed вам нужно указать расширение для параметра -i, которое используется для файлов резервных копий.
  • За командой -exec следует команда, которая будет применяться к найденным файлам, и завершается точкой с запятой, которая должна быть экранирована, иначе оболочка будет использовать ее до того, как она будет отправлена ​​для поиска.

Ответ 2

Решение с помощью find, args и sed:

find . -name '*.php' -print0 | xargs -0 sed -i 's/www.fubar.com/www.fubar.ftw.com/g'

Ответ 3

Если нет подпапок, проще запомнить способ

replace "www.fubar.com" "www.fubar.ftw.com" -- *

где * также может быть списком файлов

из руководства:

Вызвать замену одним из следующих способов:

       shell> replace from to [from to] ... -- file_name [file_name] ...
       shell> replace from to [from to] ... < file_name

Если у вас есть скрытые файлы с точкой, вы можете добавить их в * с помощью

shopt -s dotglob

Если у вас есть только одна глубина подпапок, вы можете использовать */* вместо *

replace "www.fubar.com" "www.fubar.ftw.com" -- */*

Ответ 4

Чистое решение bash

#!/bin/bash
shopt -s nullglob
for file in *.php
do
    while read -r line
    do
       echo "${line/www.fubar.com/www.fubar.ftw.com}"
    done < "$file" > tempo && mv tempo "$file"

done