в командной строке 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)?

Другие вопросы по тегам