Как сделать рекурсивный поиск / замену строки с помощью awk или sed?

Вот версия Swift 3.0:

extension UIViewController: UIGestureRecognizerDelegate {

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if touch.view is UIButton {
        return false
    }
    return true
}

Не забудьте:

Make your tapper object delegate to self (e.g: tapper.delegate = self)

614
задан codeforester 12 May 2018 в 15:36
поделиться

7 ответов

Самый простой способ заменить ( все файлы, каталог, рекурсивный )

find . -type f -not -path '*/\.*' -exec sed -i 's/foo/bar/g' {} +

Примечание: Иногда Вы, возможно, должны были бы проигнорировать некоторые скрытые файлы т.е. .git, можно использовать выше команды.

, Если Вы хотите включать использование скрытых файлов,

find . -type f  -exec sed -i 's/foo/bar/g' {} +

В оба, случаются, строка foo будет заменена новой строкой bar

1
ответ дан 22 November 2019 в 21:49
поделиться
find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'

Из man find :

-print0 (только GNU find ) сообщает find использовать нулевой символ ( \ 0 ) вместо пробела в качестве разделителя вывода между найденными путями. Это более безопасный вариант, если ваши файлы могут содержать пробелы или другие специальные символы. Рекомендуется использовать аргумент -print0 для find , если вы используете -exec или xargs ( -0 аргумент необходим в xargs . )

816
ответ дан 22 November 2019 в 21:49
поделиться

Примечание : не запускайте эту команду в папке, содержащей репозиторий git - изменения в .git могут повредить ваш индекс git.

find /home/www/ -type f -exec \
    sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

По сравнению с другими ответами здесь, это проще чем большинство, и использует sed вместо perl, что и было задано в исходном вопросе.

241
ответ дан 22 November 2019 в 21:49
поделиться
cd /home/www && find . -type f -print0 |
  xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g'
39
ответ дан 22 November 2019 в 21:49
поделиться
find /home/www/ -type f -exec perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

find / home / www / -type f выведет список всех файлов в / home / www / (и его подкаталогах). Флаг «-exec» указывает команде find запускать следующую команду для каждого найденного файла:

perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} +

- это команда, выполняемая для файлов (многих одновременно). {} заменяется именами файлов. + в конце команды указывает find создать одну команду для многих имен файлов.

Согласно справочной странице find : "Командная строка построена примерно так же, как xargs создает свои командные строки. "

Таким образом, можно достичь своей цели (и обрабатывать имена файлов, содержащие пробелы) без использования xargs -0 или -print0 .

9
ответ дан 22 November 2019 в 21:49
поделиться

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

sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *`
3
ответ дан 22 November 2019 в 21:49
поделиться

Более простой способ - использовать в командной строке следующее

find /home/www/ -type f|xargs perl -pi -e 's/subdomainA\.example\.com/subdomainB.example.com/g' 
0
ответ дан 22 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: