Peut sed
faire quelque chose comme:
12345
devenir :
1&2&3&4&5
?
Avec GNU sed
:
sed 's/./\&&/2g'
( s
remplacez chaque ( g
) caractère ( .
) par le même ( &
) précédé de &
( \&
) mais uniquement à partir de la deuxième occurrence ( 2
)).
Portablement:
sed 's/./\&&/g;s/&//'
(remplacez chaque occurrence, mais supprimez ensuite la première &
dont nous ne voulons pas).
Avec certaines awk
implémentations (pas POSIX car le comportement n'est pas spécifié pour un FS vide):
awk -F '' -v OFS="&" '{$1=$1;print}'
(avec gawk
et quelques autres awk
implémentations, un séparateur de champ vide divise les enregistrements en ses composants de caractère . Le séparateur de champ de sortie ( OFS
) est défini sur &
. Nous attribuons une valeur à $1
(lui-même) pour forcer la régénération de l'enregistrement avec le nouveau séparateur de champ avant de l'imprimer, NF=NF
fonctionne également et est légèrement plus efficace dans de nombreuses implémentations awk mais le comportement lorsque vous le faites n'est actuellement pas spécifié par POSIX).
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
exécute le code pour chaque ligne et imprime le résultat ( $_
); -l
supprime et rajoute automatiquement les fins de ligne; se -a
remplit @F
avec le fractionnement d'entrée sur le délimiteur défini dans -F
, qui est ici une chaîne vide. Le résultat est de diviser chaque caractère en @F
, puis joignez-les avec «&» et imprimez la ligne.)
Alternativement:
perl -pe 's/(?<=.)./&$&/g'
(remplacez chaque caractère à condition qu'il soit précédé d'un autre caractère (opérateur d'expression rationnelle en arrière-plan (? <= ...))
Utilisation zsh
des opérateurs shell:
in=12345
out=${(j:&:)${(s::)in}}
(encore une fois, divisez sur un séparateur de champ vide à l'aide de l' s::
indicateur d'extension de paramètre et joignez-le &
)
Ou:
out=${in///&} out=${out#?}
(remplacez chaque occurrence de rien (donc avant chaque caractère) par l' &
utilisation de l' ${var//pattern/replacement}
opérateur ksh (bien que dans ksh
un modèle vide signifie quelque chose d'autre, et pourtant quelque chose d'autre, je ne sais pas quoi bash
), et supprimez la première avec le ${var#pattern}
décapage POSIX opérateur).
Utilisation ksh93
des opérateurs shell:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
étant un opérateur glob ksh93 pour utiliser des expressions régulières de type perl (différent de perl ou PCRE), (?=.)
étant l' opérateur d'anticipation : remplacez un caractère à condition qu'il soit suivi d'un autre caractère avec lui-même ( \0
) et &
)
Ou:
out=${in//?/&\0}; out=${out#?}
(remplacez chaque caractère ( ?
) par &
et lui-même ( \0
), et nous supprimons le superflous)
Utilisation bash
des opérateurs shell:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(identique à celui zsh
de, sauf que vous en avez besoin @()
(un opérateur ksh glob pour lequel vous extglob
en avez besoin bash
)).
012345
entréeawk -F '' -v OFS="&" 'NF=NF'
Utilitaires Unix:
Expliqué:
"fold -w1"
- encapsulera chaque caractère saisi sur sa propre ligne"paste -sd\& -"
- fusionnera les lignes d'entrée ensemble, en utilisant&
comme séparateur(Notez que si l'entrée contient plusieurs lignes, elles seront jointes avec
&
)la source
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.sed
réponses disponibles ci-dessous. Et je ne vois aucun mal à démontrer comment la tâche peut être résolue par les autres moyens."-w"
, merci!"-"
, à son tour, n'est pas nécessaireIf no file operands are specified, the standard input shall be used
Utilisation
sed
la source
Informations: manuel GNU sed, extensions d'expressions régulières .
Essai:
la source
Ce sera un peu plus lent que certaines des autres réponses, mais c'est assez clair:
la source
Voici une autre façon. La première partie de l'expression sed capture chaque personnage, puis la remplace par le personnage et une esperluette. La deuxième partie supprime l'esperluette de la fin de la ligne.
Fonctionne également sur les caractères multi-octets.
la source
sed
deux fois, unsed
script peut avoir plusieurs commandes:sed -r 's/(.)/\1\&/g; s/\&$//g'