Est-ce une bonne idée de compléter le script shell avec Perl purement pour l'utilisation de regex?

Je cherche un moyen simple d'utiliser regex dans un script shell UNIX où tous les systèmes n'auront pas d'extensions perl embeddedes dans grep. Ce qui est vraiment utile à propos de perl regex, c'est les references back / forward que je n'ai pas trouvé un moyen d'utiliser efficacement dans sed. Je suis rapidement venu avec le liner suivant:

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

Q1. Est-ce un moyen sûr de faire des choses pour perl? Q2. Dois-je simplement recourir à l'écriture du script entier dans perl à la place?

Je ne comprends pas pourquoi votre extrait de perl est écrit de cette façon. Vous pourriez écrire l'expression rationnelle directement dans le script:

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

qui vous permet de profiter de l'option -n (en prime, vous obtenez un rapport d'erreur approprié en cas d'erreur d'input). En outre, en utilisant les idiomes perl:

 perl -ne 'print if /my regex/' 

Sed a des references en arrière, mais les regexes de perl sont plus puissants, il y a des choses que vous ne pouvez pas faire avec sed (sed n'a même pas d'expressions rationnelles complètes: l'alternance n'est pas une fonctionnalité standard, bien que de nombreuses implémentations l'aient).

La plupart de ce que vous pouvez faire avec les outils traditionnels, vous pouvez le faire facilement en perl. Par exemple, si vous voulez ignorer les premiers K-1 octets, vous pouvez écrire

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

Si vous voulez la portabilité, beaucoup de tâches de traitement de text peuvent être effectuées dans awk, mais awk n'a pas de references arrières, donc extraire le text d'une string peut être maladroit.