Réponses:
Avec GNU sed:
sed 's/./\&&/2g'
( sremplacez 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 awkimplémentations (pas POSIX car le comportement n'est pas spécifié pour un FS vide):
awk -F '' -v OFS="&" '{$1=$1;print}'
(avec gawket quelques autres awkimplé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=NFfonctionne é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'
( -peexécute le code pour chaque ligne et imprime le résultat ( $_); -lsupprime et rajoute automatiquement les fins de ligne; se -aremplit @Favec 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 zshdes 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 kshun 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 ksh93des 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 bashdes opérateurs shell:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(identique à celui zshde, sauf que vous en avez besoin @()(un opérateur ksh glob pour lequel vous extgloben avez besoin bash)).
awk -F '' -v OFS="&" 'NF=NF'
Utilitaires Unix:
fold -w1|paste -sd\& -
Expliqué:
"fold -w1" - encapsulera chaque caractère saisi sur sa propre ligne
plier - envelopper chaque ligne d'entrée pour s'adapter à la largeur spécifiée
-w, --width = WIDTH utilise des colonnes WIDTH au lieu de 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"- fusionnera les lignes d'entrée ensemble, en utilisant &comme séparateur
coller - fusionner des lignes de fichiers
-s, --serial coller un fichier à la fois plutôt qu'en parallèle
-d, --delimiters = LIST réutilise les caractères de LIST au lieu de TABs
%fold -w1|paste -sd\& -
1&2&3&4&5
(Notez que si l'entrée contient plusieurs lignes, elles seront jointes avec &)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed.
sedré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écessaire If no file operands are specified, the standard input shall be used
sed 's/\B/\&/g'
\ B - Correspond partout mais sur une limite de mot; c'est-à-dire qu'il correspond si le caractère à gauche et le caractère à droite sont tous les deux des caractères «mot» ou des caractères «non-mot».
Informations: manuel GNU sed, extensions d'expressions régulières .
Essai:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Ce sera un peu plus lent que certaines des autres réponses, mais c'est assez clair:
echo 12345 | perl -lnE 'say join "&", split //'
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.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Fonctionne également sur les caractères multi-octets.
seddeux fois, un sedscript peut avoir plusieurs commandes:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345entrée