Réponses:
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
)).
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
.
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é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.
sed
deux fois, un sed
script peut avoir plusieurs commandes:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
entrée