Vous pouvez utiliser des one-liners perl comme vous le faites avec sed, avec l'avantage du support complet des expressions régulières perl (qui est beaucoup plus puissant que ce que vous obtenez avec sed). Il y a aussi très peu de variation entre les plates-formes * nix - perl est généralement perl. Ainsi, vous pouvez arrêter de vous soucier de la façon dont la version de sed de votre système particulier fait ce que vous voulez.
Dans ce cas, vous pouvez faire
perl -pe 's/(regex)/\n$1/'
-pe
met perl dans une boucle "exécuter et imprimer", un peu comme le mode de fonctionnement normal de sed.
'
cite tout le reste pour que le shell n'interfère pas
()
entourant l'expression régulière est un opérateur de regroupement. $1
sur le côté droit de la substitution imprime tout ce qui correspond à l'intérieur de ces parenthèses.
Enfin, \n
est une nouvelle ligne.
Que vous utilisiez ou non des parenthèses comme opérateur de regroupement, vous devez échapper toutes les parenthèses que vous essayez de faire correspondre. Ainsi, une expression régulière correspondant au modèle que vous avez énuméré ci-dessus serait quelque chose comme
\(\d\d\d\)\d\d\d-\d\d\d\d
\(
ou \)
correspond à un paren littéral et \d
correspond à un chiffre.
Mieux:
\(\d{3}\)\d{3}-\d{4}
J'imagine que vous pouvez comprendre ce que font les nombres entre accolades.
De plus, vous pouvez utiliser des délimiteurs autres que / pour votre regex. Donc, si vous avez besoin de correspondre / vous n'aurez pas besoin d'y échapper. L'un ou l'autre des éléments ci-dessous est équivalent à l'expression régulière au début de ma réponse. En théorie, vous pouvez remplacer n'importe quel caractère pour le standard /.
perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'
Quelques dernières réflexions.
utiliser -ne
au lieu de -pe
agit de la même manière, mais ne s'imprime pas automatiquement à la fin. Cela peut être pratique si vous souhaitez imprimer vous-même. Par exemple, voici un grep-alike ( m/foobar/
est une correspondance regex):
perl -ne 'if (m/foobar/) {print}'
Si vous trouvez que le traitement des nouvelles lignes est gênant et que vous voulez que cela soit géré par magie pour vous, ajoutez -l
. Pas utile pour l'OP, qui travaillait avec des nouvelles lignes, cependant.
Astuce bonus - si vous avez installé le paquet pcre, il est livré avec pcregrep
, qui utilise des expressions régulières entièrement compatibles avec Perl.
sed '/regex/G'