2009-08-04 4 views
1

Quelle est la manière la plus simple d'analyser les caractères de continuation de ligne? Cela semble être une action si fondamentale que je suis surpris qu'il n'y ait pas de commande de base pour cela. "while read" et "while read -r" ne font pas ce que je veux, et la solution la plus simple que j'ai trouvée est la solution sed ci-dessous. Y at-il un moyen de le faire avec quelque chose de fondamental comme TR?Suite de lignes d'analyse

 
$ cat input 
Output should be \ 
one line with a '\' character. 
$ while read l; do echo $l; done < input 
Output should be one line with a '' character. 
$ while read -r l; do echo $l; done < input 
Output should be \ 
one line with a '\' character. 
$ sed '/\\$/{N; s/\\\n//;}' input 
Output should be one line with a '\' character. 
$ perl -0777 -pe 's/\\\n//s' input 
Output should be one line with a '\' character. 

+0

Notez que la solution perl fonctionne uniquement avec un drapeau/g, et je ne suis même pas sûr de savoir comment modifier le sed pour gérer plusieurs continuation, démontrant la fragilité de ces solutions. –

+0

Vous voulez faire le remplacement de sed global: '/ \\ $/{N; s/\\\ n // g;} ' – dmckee

+0

parce que les fichiers texte normaux n'ont généralement pas besoin d'un \ à la fin pour signifier la continuation. la continuation de la ligne est liée à la coquille. – ghostdog74

Répondre

1

Si par "simple"-vous dire concise et lisible, je vous suggère votre perl-isme avec une petite modification:

$ perl -pe 's/\\\n//' /tmp/line-cont 

Pas besoin de la peut-être la mémoire intensive ... -0777 ... (fichier entier slurp mode).

Si, cependant, par "simple"-vous dire pas la coquille laissant, cela suffit:

$ { while read -r LINE; do 
    printf "%s" "${LINE%\\}"; # strip line-continuation, if any 
    test "${LINE##*\\}" && echo; # emit newline for non-continued lines 
    done; } < /tmp/input 

(je préfère printf "%s" $USER_INPUT-echo $USER_INPUT parce écho ne peut pas portably être dit pour arrêter de chercher des commutateurs, printf est généralement intégré de toute façon.)

Rentrez simplement cela dans une fonction définie par l'utilisateur et ne soyez plus jamais révolté par celle-ci. Attention: cette dernière approche ajoutera un retour chariot à un fichier qui en manque.

0

La manière regex ressemble à la route à suivre.

0

Je voudrais aller avec la solution Perl simplement parce que ce sera probablement le plus extensible si vous voulez ajouter plus de fonctionnalités plus tard.