J'ai un fichier contenant du texte comme celui-ci:
AAAA
BBBB
CCCC
DDDD
1234
5678
9012
3456
EEEE
7890
etc...
Et je veux faire correspondre les lignes alphabétiques avec les lignes numériques afin qu'elles soient comme ceci:
AAAA 1234
BBBB 5678
CCCC 9012
DDDD 3456
EEEE 7890
Quelqu'un connaît-il un moyen simple d'y parvenir?
emacs
.. Êtes-vous à la recherche d'uneelisp
solution, ou comment exécuter un shell-script depuis emacs?Réponses:
À sens unique en utilisant
perl
:Contenu de
script.pl
:Contenu de
infile
:Exécutez-le comme:
Et résultat:
la source
s/\A\s*(.*?)\s*\Z/\1/
.Dans
awk
, en préservant les lignes vides, en supposant que le fichier est bien formaté, mais une logique pourrait être ajoutée pour vérifier le fichier:la source
ou, en une seule étape, sans fichiers temporaires
La dernière
sed
étape supprime le délimiteur sur les lignes vides, qui est introduit parpaste
...la source
Avec emacs, utilisez les opérations de rectangle pour couper les lignes de texte et collez-les avant les lignes numériques.
la source
Si les entrées sont en ordre,
Divisez l'entrée en entrées alphabétiques et numériques, en utilisant
grep
:grep "[[:alpha:]]\+" < file > alpha
grep "[[:digit:]]\+" < file > digit
Joignez les deux fichiers résultants
alpha
etdigit
, en utilisantpaste
:paste alpha digit
(vous pouvez l'ajouter-d " "
pour qu'il utilise un espace au lieu d'un onglet)la source
paste <(grep "[[:alpha:]]\+" file) <(grep "[[:digit:]]\+" file)
ou avec une seule substitution de processus:grep "[[:alpha:]]\+" file | paste - <(grep "[[:digit:]]\+" file)
.Dommage que awk n'ait pas de belles fonctions push / pop / unshift / shift. Voici un court extrait de Perl
la source
default
clause, les lignes vierges sont immédiatement imprimées, donc le blanc avant "1234" s'affichera avant la ligne "AAAA".Donnez un fichier avec du texte, essayez d'utiliser
pr
et de traiter la syntaxe de substitution comme ci-dessous:Vous pouvez ajuster la largeur
-w9
ou supprimer les espaces parsed "s/ //g"
.la source