Je suis tellement confus avec GNU sed
, POSIX sed
et sed
la myriade d'options de BSD . Comment remplacer le littéral \n
par le caractère de nouvelle ligne en utilisant ces trois sed
types?
foo\\nbar
ou foo\\\nbar
?
Je suis tellement confus avec GNU sed
, POSIX sed
et sed
la myriade d'options de BSD . Comment remplacer le littéral \n
par le caractère de nouvelle ligne en utilisant ces trois sed
types?
foo\\nbar
ou foo\\\nbar
?
Réponses:
sed 's/\\n/\
/g'
Remarquez la barre oblique inverse juste avant d'appuyer sur return dans la chaîne de remplacement.
sed
commande d' origine dans Unix v7 en 1979. Le seul endroit où cela pourrait ne pas fonctionner serait des implémentations non POSIX allégées sed
comme certaines implémentées allégées basées sur la boîte occupée. Cela ne fonctionnera pas dans csh mais c'est un problème csh.
\\n
est utilisé dans la partie recherche, pourquoi ne pas l'utiliser \n
dans le remplacement? le premier semble impliquer que le second existe. c'est à dire. pourquoi pas$ echo '1\n2'|sed 's/\\n/\n/g'
\n
est un littéral, ce qui implique qu'il apparaît comme les deux caractères: abackslash suivi de n
, et non comme un seul caractère de nouvelle ligne. Par conséquent, deux barres obliques inverses pour faire de la barre oblique inverse un littéral, puisn
Puisque vous avez déjà votre sed
réponse portable , je mentionnerai simplement que sed
c'est rarement le meilleur outil si vous devez en quelque sorte manipuler des nouvelles lignes. Perl est presque aussi portable que sed
, est installé par défaut sur la plupart des systèmes * nix et peut gérer cela très facilement:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Un autre choix très portable est awk
:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
Sur Solaris, n'oubliez pas d'utiliser le awk standard dans / usr / xpg4 / bin, celui dans / bin est un historique et ne doit pas être utilisé pour les nouveaux scripts.
awk
a des problèmes de portabilité similaires (est ma awk
plaine vieux awk
, nawk
ou gawk
?). En fait, la version de mes boîtiers Solaris manque gsub()
. Mon vote ici est pour Perl (se perl -nlawe '...'
rapproche du comportement automatique de awk
).
awk
portabilité, restez avec une version awk
compatible POSIX et n'utilisez que ces fonctionnalités et tout devrait bien se passer. Sur Solaris, vous en trouverez un en tant que /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
devrait fonctionner à peu près partout. Même busybox a un awk
.
Si H
oldspace est vide, vous pouvez également faire:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... mais la réponse de uxnut est déjà à la fois plus rapide et plus simple, vous pouvez donc la prendre comme bon vous semble .
Une autre possibilité étrangère:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Mais attention, ^ qui traduit toutes les \
échappements antislash de style C standard - comme \b
ackspace et \r
eturn et \00
octals et whathaveyou.
Avec gnu sed
les éléments suivants fonctionne également:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Vous avez besoin d'une solution dans sed, qui est déjà donnée ci-dessous. Mais je voulais ajouter une autre possibilité que IMHO est juste plus facile et plus rapide,
tr -d "\n"