Стоит ли дополнять скрипт оболочки Perl исключительно для использования регулярных выражений?

Стоит ли дополнять скрипт оболочки Perl исключительно для использования регулярных выражений?

Я ищу простой способ использовать regex в скрипте оболочки UNIX, где не каждая система будет иметь встроенные расширения perl в grep. Что действительно полезно в perl regex здесь, так это ссылки назад/вперед, которые я не нашел способа эффективно использовать в sed. Я быстро придумал следующую 1 строку:

tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'

В1. Безопасен ли этот способ для Perl? В2. Стоит ли мне вместо этого просто прибегнуть к написанию всего скрипта на Perl?

решение1

Я не понимаю, почему ваш фрагмент perl написан таким образом. Вы можете написать регулярное выражение прямо внутри скрипта:

perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'

что позволяет вам воспользоваться опцией -n(в качестве бонуса вы получаете надлежащее сообщение об ошибке в случае ошибки ввода). Дальнейшее использование идиом perl:

perl -ne 'print if /my regex/'

В Sed есть обратные ссылки, но расширенные регулярные выражения Perl более мощны, есть вещи, которые вы не сможете сделать с помощью sed (в sed даже нет полных регулярных выражений: чередование \|не является стандартной функцией, хотя во многих реализациях оно есть).

Большинство того, что вы можете сделать с помощью традиционных инструментов, вы можете легко сделать в Perl. Например, если вы хотите пропустить первые K-1 байт, вы можете написать

perl -ne 'BEGIN {read ARGV, "", 42-1}; …'

Если вам нужна переносимость, многие задачи по обработке текста можно выполнить в awk, но в awk вообще нет обратных ссылок, поэтому извлечение текста из строки может быть неудобным.

Связанный контент