2013-03-20 3 views
0

Это команда, которую я хочу перевести в функцию ЗШ, которая делает глобальный поиск и замена строки:Как превратить эту команду в ЗШ функции

find ./ -type f -exec sed -i 's/string1/string2/' {} \; 

Я попытался:

gr() { 
    find ./ -type f -exec sed -i 's/$1/$2/' {} \; 
} 

Но это не работает.

+0

не очень полезно без вывода, которое вы получаете. Откуда вы знаете, что он не работает? Вы запустили функцию zsh с помощью набора отладки? Каков результат при вызове? – mdpc

ответ

4

Очевидная ошибка - неправильная цитата - как всегда. ' не позволяет оболочке расширять переменные, что вам нужно. Используйте " вместо этого - и, возможно, вы также хотите, глобальный флаг для СЭД:

gr() { 
    find ./ -type f -exec sed -i "s/$1/$2/g" {} \; 
} 

Однако это не очень zsh -stylish ... следующий короче и имхо лучше читать:

gr() { 
    sed -i "s/$1/$2/g" **/*(.) 
} 
  • ** поиск рекурсивно, но не следует Symlinks (используйте ***, если вы хотите, чтобы)
  • (.) Li сопоставляет результаты с обычными файлами
+0

Спасибо! Оно работает! –

+0

Будьте осторожны, если текст до или после содержит символ '/'; обязательно избегайте их. Например, 'gr" метров в секунду "" m \/s "' – chepner

+1

Или используйте 'sed -i 's # $ {1 // #/\\ #} # $ {2 // #/\\ #} #g "**/* (.)'. Это уродливо, но гарантирует, что любые символы из двух аргументов, соответствующие разделителю 'sed', будут правильно экранированы. – chepner

Смежные вопросы