J'ai une commande de remplacement sed que je voudrais être compatible avec BSD sed
ainsi que GNU sed
. Les expressions régulières étendues ne sont pas un problème car je n'en ai pas besoin dans ce cas. Mon problème principal est la différence dans la façon dont les deux sed
interprètent les séquences d'échappement de caractères dans les chaînes de remplacement . Ma chaîne de remplacement contient des onglets et des sauts de ligne et j'aimerais qu'ils soient visibles dans les chaînes de commande pour faciliter la maintenance, cependant, BSD sed
n'interprète pas les séquences d'échappement et GNU le sed
fait . Quelle est la manière appropriée d'instruire sed
pour interpréter ces séquences d'échappement sur BSD? Les deux extraits suivants résument mon problème:
GNOU sed
echo ABC | sed 's/B/\n\tB\n'
yeilds
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
les rendements
AntBnC
De toute évidence, \n
et \t
ne sont pas interprétés comme des séquences d'échappement par BSDsed
Maintenant, à ma question. Selon la sed
page de manuel BSD :
Pour spécifier un caractère de nouvelle ligne dans la chaîne de remplacement, faites-le précéder d'une barre oblique inverse.
Cela implique-t-il que je devrais précéder une nouvelle ligne littérale d'une barre oblique inverse? Quelle est la manière appropriée d'instruire sed
pour interpréter les séquences d'échappement comme \n
dans le texte de remplacement?
sed
. En fin de compte, il sera probablement judicieux d'utiliser awk. Alors, que pensez-vous de l'interprétation de la page de manuel BSD sed que j'ai citée?Réponses:
Si vous avez besoin d'écrire des scripts portables, vous devez vous en tenir aux fonctionnalités de la norme POSIX (alias Single Unix alias Open Group Base Specification). Le numéro 7 aka POSIX-1.2008 est le dernier, mais de nombreux systèmes n'ont pas encore fini de l'adopter. Le numéro 6 aka POSIX-1.2001 est généralement fourni par tous les appareils modernes.
Dans sed , le sens des séquences d'échappement comme
\t
et\n
n'est pas portable, sauf que dans un regex ,\n
représente une nouvelle ligne. Dans le texte de remplacement d'unes
commande,\n
n'est pas portable, mais vous pouvez utiliser la séquence backslash-newline pour représenter une nouvelle ligne.Une manière portable de générer un caractère de tabulation (ou tout autre caractère exprimé en octal) est avec
tr
. Stockez le caractère dans une variable shell et remplacez cette variable dans l'extrait sed.Notez à nouveau que les nouvelles lignes doivent être exprimées différemment dans les expressions rationnelles et dans
s
les textes de remplacement.Vous voudrez peut-être utiliser awk à la place. Il autorise les échappements à barre oblique inverse, y compris les échappements octaux
\ooo
, dans chaque chaîne littérale.la source
Vous pouvez utiliser la
$'...'
citation bash pour interpréter les échappements avant de passer la chaîne àsed
.Depuis la page de manuel de bash:
la source
Cela a été répondu sur Stack Overflow:
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
C'est à peu près exactement ce que jw013 a dit.
Pour insérer un onglet littéral, tapez ctrl+ VTab.
la source