Je suis tellement confus avec GNU sed, POSIX sedet sedla myriade d'options de BSD . Comment remplacer le littéral \npar le caractère de nouvelle ligne en utilisant ces trois sedtypes?
foo\\nbarou foo\\\nbar?
Je suis tellement confus avec GNU sed, POSIX sedet sedla myriade d'options de BSD . Comment remplacer le littéral \npar le caractère de nouvelle ligne en utilisant ces trois sedtypes?
foo\\nbarou 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.
sedcommande 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 sedcomme 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.
\\nest utilisé dans la partie recherche, pourquoi ne pas l'utiliser \ndans le remplacement? le premier semble impliquer que le second existe. c'est à dire. pourquoi pas$ echo '1\n2'|sed 's/\\n/\n/g'
\nest 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 sedréponse portable , je mentionnerai simplement que sedc'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.
awka des problèmes de portabilité similaires (est ma awkplaine vieux awk, nawkou 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).
awkportabilité, restez avec une version awkcompatible 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 Holdspace 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 \backspace et \return et \00octals et whathaveyou.
Avec gnu sedles é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"