Comment puis-je diviser les lettres d'un mot, avec chaque lettre sur une ligne distincte?
Par exemple, étant donné "StackOver"
que j'aimerais voir
S
t
a
c
k
O
v
e
r
Je suis nouveau à bash donc je n'ai aucune idée par où commencer.
command-line
split
words
Sijaan Hallak
la source
la source
Here string
, l'équivalent grosso modo d'unecho foo | ...
peu moins de frappe. Voir tldp.org/LDP/abs/html/x17837.html.
à\B
(ne correspond pas sur une frontière de mot).sed
comme:sed -et -e's/./\n&/g;//D'
Vous souhaiterez peut-être casser les grappes de graphèmes au lieu des caractères si l'intention est d'imprimer le texte verticalement. Par exemple avec un
e
avec un accent aigu:Avec des grappes de graphèmes (
e
avec son accent aigu serait un grappe de graphèmes):(ou
grep -Po '\X'
avec GNU grep construit avec le support PCRE)Avec des personnages (ici avec GNU
grep
):fold
est censé casser les caractères, mais GNUfold
ne prend pas en charge les caractères multi-octets, il se brise donc sur les octets à la place:Sur StackOver qui ne se compose que de caractères ASCII (donc un octet par caractère, un caractère par grappe de graphèmes), les trois donneraient le même résultat.
la source
grep -Po
ne pas faire ce à quoi on pourrait s'attendre (comme legrep -P
fait).grep -Po .
trouve des caractères (et un accent aigu combiné après un caractère de nouvelle ligne n'est pas valide) etgrep -Po '\X'
trouve des grappes de graphes pour moi. Vous aurez peut-être besoin d'une version récente de grep et / ou PCRE pour qu'elle fonctionne correctement (ou essayezgrep -Po '(*UTF8)\X'
)Si vous avez perl6 dans votre boîte:
travailler quel que soit votre environnement local.
la source
Avec de nombreuses
awk
versionsla source
awk -v FS='' -v OFS='\n' '{$1=$1};1'
( se demandant si c'est plus facile à transporter car-F ''
pourrait donner l'ERE://
)Ce qui suit sera générique:
la source
la source
Puisque vous avez spécifiquement demandé une réponse en bash, voici une façon de le faire en bash pur:
Notez que cela interceptera la nouvelle ligne à la fin du " document ici ". Si vous voulez éviter cela, mais toujours parcourir les caractères avec une boucle bash, utilisez
printf
pour éviter la nouvelle ligne.la source
Aussi Python 2 peut être utilisé à partir de la ligne de commande:
ou:
ou (comme commenté par 1_CR) avec Python 3 :
la source
Vous pouvez utiliser la
fold (1)
commande. Il est plus efficace quegrep
etsed
.Une différence significative est que le pli reproduira les lignes vides dans la sortie:
la source
Vous pouvez gérer des caractères multi-octets comme:
Ce qui peut être assez pratique lorsque vous travaillez avec une entrée en direct car il n'y a pas de mise en mémoire tampon et un caractère est imprimé dès qu'il est entier .
la source
sed
servent les scripts. je ne suis pas susceptible d'en écrire un en ce moment - je suis assez endormi. il est cependant très utile lors de la lecture d'un terminal.dd
cela cassera les caractères multi-octets, donc la sortie ne sera plus du texte donc le comportement de sed ne sera pas spécifié selon POSIX.Vous pouvez également utiliser des limites de mots ..
la source
En bash:
Cela fonctionne avec n'importe quel texte et avec uniquement des internes bash (aucun utilitaire externe appelé), donc, devrait être rapide sur des chaînes très courtes.
Production:
S'il est correct de changer IFS et de changer les paramètres de position, vous pouvez également éviter l'appel de sous-shell:
la source
mises à jour ici est la manière la plus rapide | pureBashBased!
pour plus de génialité
la source
fold -b1
?cela divisera votre mot et le stockera dans un tableau
var
.la source
la source