En utilisant un outil de ligne de commande commun comme sed ou awk, est-il possible de joindre toutes les lignes se terminant par un caractère donné, comme une barre oblique inverse?
Par exemple, étant donné le fichier:
foo bar \
bash \
baz
dude \
happy
Je voudrais obtenir cette sortie:
foo bar bash baz
dude happy
text-processing
awk
sed
perl
Cory Klein
la source
la source
cpp
:)sed
FAQRéponses:
une solution sed plus courte et plus simple:
ou one-liner si vous utilisez GNU
sed
:la source
sed
:) ... vous ajoutez chaque ligne directement à l'espace-motif, et lorsqu'une ligne "normalement terminée" apparaît, la tout l’espace du modèle tombe à travers et les impressions automatiques (car il n’ya pas d’option -n) ... soignée! .. +1sed -e :a -e '/\\$/N; s/\\\n//; ta'
C'est peut-être plus facile avec perl (puisque perl est comme sed et awk, j'espère que c'est acceptable pour vous):
la source
Voici une solution awk. Si une ligne se termine par un
\
, supprimez la barre oblique inverse et imprimez la ligne sans fin de nouvelle ligne; sinon, imprimez la ligne avec une nouvelle ligne.Ce n'est pas trop mal dans sed, même si awk est évidemment plus lisible.
la source
Ce n'est pas une réponse en tant que telle. C'est une question secondaire à propos de
sed
.Plus précisément, je devais
sed
séparer les commandes de Gilles, pièce par pièce, pour le comprendre. J'ai commencé à écrire des notes dessus, puis j'ai pensé que cela pourrait être utile ici à quelqu'un ...alors voila ... le script sed de Gilles au format documenté :
la source
Un autre outil courant en ligne de commande serait celui
ed
qui modifie par défaut les fichiers sur place et laisse donc les autorisations de fichier non modifiées (pour plus d'informations,ed
voir Modification de fichiers avec l'éditeur de texte ed à partir de scripts ).la source
En utilisant le fait que
read
dans le shell interprétera les barres obliques inverses lorsqu’il est utilisé sans-r
:Notez que cela interprétera également toute autre barre oblique inverse dans les données.
la source
a\\b\\\\\\\\\\\c
Une solution simple qui charge tout le fichier en mémoire:
Ou encore une version courte qui fonctionne et qui comprend les lignes (en sortie) (syntaxe GNU):
Sur une ligne (syntaxe POSIX):
Ou utilisez awk (si le fichier est trop gros pour tenir dans la mémoire):
la source
La version Mac basée sur la solution @Giles ressemblerait à ceci
Où la différence principale réside dans la façon dont les nouvelles lignes sont représentées;
la source
Vous pouvez utiliser cpp, mais cela produit des lignes vides où il a fusionné la sortie, et une introduction que je supprime avec sed - peut-être que cela peut être fait avec cpp-flags et options:
la source
cpp
est une solution? Dans votre exemple, laecho
chaîne with entre guillemets génère déjà du texte redressé, ellecpp
est donc inutile. (Ceci s'applique également à votresed
code.) Si vous mettez la chaîne entre guillemetscpp
simples, supprime simplement les barres obliques inverses, mais ne concatène pas les lignes. (La concaténation aveccpp
fonctionnerait s'il n'y avait pas d'espace avant les barres obliques inverses, mais les mots séparés seraient joints sans séparateurs.)cpp
comme ça ne me permet toujours pas de concaténer les lignes. Et l'utilisation desed
est définitivement inutile. Utilisationcpp -P
: «-P
Inhibe la génération de marqueurs de ligne dans la sortie du préprocesseur.» - man cppcpp: “-P: No such file or directory cpp: warning: '-x c' after last input file has no effect cpp: unrecognized option '-P:' cpp: no input files
Acpp --version
révèlecpp (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
- quoi? Ubuntu corrige cpp? Pourquoi? Je me serais attendu à lire GNU ...cpp
concatène effectivement les lignes et laisse quelques blancs. Encore plus intéressant, la même version 4.4.3-4ubuntu5.1 accepte ici-P
. Cependant, seuls les marqueurs de lignes sont éliminés, les lignes vides restent.