J'ai une longue ligne que je veux insérer un espace tous les 4 caractères, sur une seule ligne de texte solide pour en faciliter la lecture, quelle est la façon la plus simple de le faire? je devrais aussi pouvoir entrer la ligne à partir d'un tuyau. par exemple
echo "foobarbazblargblurg" | <some command here>
donne
foob arba zbla rgbl urg
command-line
shell
text-processing
xénoterracide
la source
la source
sed
j'ai essayé d'abord que je pouvais me donner un coup de pied.'s/.\{4\}/& /g;s/ $//'
Vous pouvez utiliser l'exemple simple suivant:
la source
sed
réponse. Je ne savais pasfold
avant.fold
, cela ne fonctionne pas avec les caractères multi-octets (commeecho €€€€€€€€ | fold -w4 | paste -sd' ' -
dans UTF-8).Voici l'exemple utilisant
grep
etxargs
:la source
xargs
s'exécuteecho
par défaut, donc il ne fonctionnera pas avec des mots comme-nen
ou qui contiennent des barres obliques inverses selon l'echo
implémentation. Vous verrez également le caractère de nouvelle ligne étrange de temps en temps si xargs en exécute plusieursecho
. Mieux vaut y aller à lapaste -sd ' ' -
place. Notez que ce-o
n'est pas une option standard.En bash uniquement, aucune commande externe:
ou en version tube à une ligne:
La façon dont cela fonctionne consiste à convertir chaque caractère de la chaîne en "(.)" Pour la correspondance regex et la capture avec
=~
, puis il suffit de sortir les expressions capturées à partir duBASH_REMATCH[]
tableau, groupées selon les besoins. Les espaces de début / de fin / intermédiaires sont conservés, supprimez les guillemets"${BASH_REMATCH[@]:1}"
pour les supprimer.Ici, il est enveloppé dans une fonction, celle-ci traitera ses arguments ou lira stdin s'il n'y a pas d'arguments:
Vous pouvez facilement paramétrer le nombre pour ajuster la chaîne de format en conséquence.
Un espace de fin est ajouté, utilisez deux
printf
s au lieu d'un si c'est un problème:Le premier
printf
imprime (jusqu'à) les 4 premiers caractères, le second imprime conditionnellement tout le reste (le cas échéant) avec un espace de tête pour séparer les groupes. Le test porte sur 5 éléments et non sur 4 pour tenir compte de l'élément zéro.Remarques:
printf
d »%c
pourraient être utilisés à la place%s
,%c
(peut - être) rend l'objet plus claire, mais pas de caractères multi-octets. Si votre version de bash est capable, tout ce qui précède est sûr pour les caractères multi-octets.printf
réutilise sa chaîne de format jusqu'à ce qu'il soit à court d'arguments, donc il engloutit simplement 4 arguments à la fois et gère les arguments de fin (donc aucun cas de bord nécessaire, contrairement à certaines des autres réponses ici qui sont sans doute fausses)BASH_REMATCH[0]
est toute la chaîne correspondante, donc uniquement la sortie à partir de l'index 1printf -v myvar ...
place pour stocker dans une variablemyvar
(sous réserve du comportement habituel en boucle de lecture / sous-shell)printf "\n"
si nécessaireVous pouvez faire fonctionner ce qui précède
zsh
si vous utilisez le tableaumatch[]
au lieu deBASH_REMATCH[]
, et soustrayez 1 de tous les index carzsh
ne conserve pas un élément 0 avec la correspondance entière.la source
Avec
zsh
seulement:Ou
avec
ksh93
seulement:Avec n'importe quel shell POSIX uniquement (évitant également l'espace de fin si la longueur d'entrée est un multiple de 4):
Maintenant, c'est pour les personnages . Si vous vouliez le faire sur des grappes de graphèmes (par exemple, casser
Stéphane
, écrit comme$'Ste\u0301phane'
, commeStép hane
et nonSte phan e
), aveczsh
:Avec ksh93, vous pouvez également découper par largeur d'affichage, ce qui fonctionnerait pour cela
Stéphane
ci - dessus, mais pourrait également aider lorsque d'autres types de caractères de largeur nulle ou double largeur sont impliqués:la source
Je vais répondre en insérant uniquement des espaces comme requis afin qu'un espace apparaisse au moins tous les 4 caractères sur une ligne; Je ne sais pas de quelle manière vous voulez gérer ce cas. Par exemple, étant donné l'entrée de "aa bbccdd", vous obtiendrez la sortie "aa bbcc dd" plutôt que "aa b bccd d".
J'utilise Perl pour l'anticipation, mais je ne connais pas très bien Perl en général, il peut donc y avoir des ajustements nécessaires:
la source
Je l'ai fait en utilisant python
Je lis d'abord le fichier, puis je divise par 4 caractères et j'ajoute de l'espace
/root/l.txt ==> Se compose du contenu que vous avez donné dans l'exemple
sortie
la source