в командной строке perl один лайнер для поиска / замены, но * не * печатать строки, которые не совпадают?
Я хочу выполнить поиск и замену регулярного выражения в файле в командной строке со сложным регулярным выражением, поэтому мне нужен PCRE, и я использую perl -pe "s/foo/bar"
(скорее, чем sed
), который распечатывает все строки после применения s///
, но он также печатает несоответствующие строки.
Есть ли perl
однострочный интерфейс командной строки, который не будет печатать несоответствующие строки? я знаюperl -pe s/foo/bar/ if /foo/
, но тогда мне нужно продублировать регулярное выражение. Возможно ли это без повторения?
2 ответа
Ты можешь использовать -n
флаг (который, в отличие от-p
, не печатает автоматически все строки) и печатает только те строки, которые соответствуют регулярному выражению:
perl -ne 's/foo/bar/ && print'
Или, что то же самое:
perl -ne 'print if s/foo/bar/'
Ответ от @Dada показывает самый лаконичный метод решения точной проблемы OP.
Ниже приведены несколько других эквивалентных, но более длинных способов сделать то же самое. Их преимущество состоит в том, что эти однострочные символы можно более легко расширить для выполнения некоторого другого дополнительного кода (при необходимости) в дополнение к простой печати строк.
perl -ne 'if ( s{foo}{bar} ) { print; }'
# Same:
perl -ne 'next LINE unless s{foo}{bar}; print;'
Их можно расширить до:
perl -ne 'if ( s{foo}{bar} ) { some(); other(); code(); print; }'
# Same:
perl -ne 'next LINE unless s{foo}{bar}; some(); other(); code(); print;'
СМОТРИТЕ ТАКЖЕ:
perlrun: параметры командной строки
Что должен знать каждый хакер Perl о perl -ne?
Чтобы увидеть эти переключатели командной строки в различных сценариях использования, в том числе в некоторых отличных однострочниках Perl, см.:
Какой у вас последний полезный однострочник Perl (или конвейер с использованием Perl)?