Je voudrais joindre des lignes qui se terminent par un |
avec la ligne suivante.
Exemple:
abcd| ef 123456| 78| 90
Sortie désirée:
abcdef 1234567890
Cela pourrait fonctionner pour vous (GNU sed):
sed ':a;N;s/|\s*\n//;ta;P;D' file
Avec GNU sed:
$ sed ':a;/| *$/{N;ba};s/| *\n//g' infile abcdef 1234567890
Cela fait ce qui suit:
:a # Label to branch to /| *$/{ # If the line ends with a pipe and optional spaces N # Append next line to pattern space ba # Branch to label } s/| *\n//g # Remove all pipes followed by optional spaces and a newline
Pour que cela fonctionne sous BSD sed, la commande doit être divisée après les étiquettes et les commandes de twigment:
sed -e ':a' -e '/| *$/{N;ba' -e '};s/| *\n//g' infile
Avec GNU awk pour RS multi-char:
$ awk -v RS='[|]\\s*\\n' -v ORS= '1' file abcdef 1234567890
Avec d’autres astuces, un moyen serait:
$ awk 'sub(/\|[[:blank:]]*$/,"") {s = s $0; next} {print s $0; s=""}' file abcdef 1234567890
Si votre dernière ligne de saisie peut se terminer par |
vous devez nous dire comment gérer cela et append des exemples d’entrées / sorties, y compris ce cas, à votre question.
Vous pouvez essayer ce sed
,
sed ':loop; /| *$/{N;s/\n//g}; t loop' yourfile | sed 's/ *| *//g'
awk
à la rescousse! Le script suivant supprime les caractères de canal et les nouvelles lignes lorsqu’ils se produisent.
$ awk '{c=sub(/\|/,"")?"":"\n"; $1=$1; printf "%s%s",$0,c}' file abcdef 1234567890
J’ai commencé avec ça
awk -F '|' 'NF>1 {printf "%s", $1} NF==1' file
Mais alors j’ai pensé que cela faisait trop d’hypothèses sur le nombre de champs que vous pourriez avoir. J’ai donc fini avec
awk -F '|' '{if (NF>1 && $NF ~ /^[[:blank:]]*$/) {NF--; printf "%s", $0} else print}' file
ce qui est beaucoup plus robuste mais moins laconique.
Considérant que le texte saisi est stocké dans un nom de fichier infile
Vous pouvez utiliser cette commande GNU sed: sed ':begin;$!N;s/\n//;s/\s//g;s/|//g' infile
awk '{sub(/\|/,"")}{printf "%s",$1}/f/{print "\r"}END {print ""}' file abcdef 1234567890