Какой инструмент командной строки GNU / Linux я бы использовал для выполнения поиска и замены в файле?
Вопрос
Какой инструмент командной строки GNU / Linux я бы использовал для выполнения поиска и замены в файле?
Можно ли указать текст поиска и замену в формате регулярных выражений?
Решение
sed 's/a.*b/xyz/g;' old_file > new_file
GNU sed (который у вас, вероятно, есть) еще более универсален:
sed -r --in-place 's/a(.*)b/x\1y/g;' your_file
Вот краткое объяснение этих вариантов:
-i[СУФФИКС], --на месте[=СУФФИКС] редактирование файлов на месте (создание резервной копии, если указано расширение)
-r, --регулярное выражение-расширенное используйте расширенные регулярные выражения в скрипте.
Тот Самый FreeBSD версия также поддерживает эти опции.Тот Самый NetBSD и OpenBSD поддерживаются только версии -r
.
Если вы хотите узнать больше о sed, Кори предложил этот учебник.
Другие советы
Perl был изобретен для этого:
perl -pi -e 's/foo/bar/g;' *.txt
Любой обычный шаблон s /// в этих одинарных кавычках.Вы можете сохранить резервную копию с помощью чего-то вроде этого:
perl -pi.bak -e 's/foo/bar/g;' *.txt
Или трубопровод:
cat file.txt | perl -ne 's/foo/bar/g;' | less
Но на самом деле это в большей степени работа sed.
Рассмотрим Ruby как альтернативу Perl.Это украло большую часть однострочных аргументов командной строки Perl (-i
, -p
, -l
, -e
, -n
) и автоматические настройки $_
для вас, как это делает Perl, и у него много полезных регулярных выражений.Кроме того, синтаксис Ruby может быть более удобным и его легче читать или писать, чем синтаксис Perl или sed.(Или нет, в зависимости от ваших вкусов.)
ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt
против.
perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt
Во многих случаях, когда имеешь дело с однострочниками, производительность не является достаточной проблемой, чтобы заботиться о том, используете ли вы легкий sed, тяжелый Perl или более тяжелый Ruby.Используйте все, что проще всего написать.
сэд, редактор потоков, и да, он использует регулярные выражения.