Risposte:
Con GNU sed
:
sed 's/./\&&/2g'
( s
ubstitute ogni ( g
) carattere ( .
) con lo stesso ( &
) preceduto da &
( \&
) ma a partire solo dalla seconda occorrenza ( 2
)).
portabile:
sed 's/./\&&/g;s/&//'
(sostituisci ogni ricorrenza, ma poi rimuovi il primo &
che non vogliamo).
Con alcune awk
implementazioni (non POSIX in quanto il comportamento non è specificato per un FS vuoto):
awk -F '' -v OFS="&" '{$1=$1;print}'
(con gawk
e alcune altre awk
implementazioni, un separatore di campo vuoto divide i record nei suoi componenti di carattere . Il separatore di campo di output ( OFS
) è impostato su &
. Assegniamo un valore a $1
(stesso) per forzare la rigenerazione del record con il nuovo separatore di campo prima di stamparlo, NF=NF
funziona anche ed è leggermente più efficiente in molte implementazioni awk ma il comportamento quando lo fai è attualmente non specificato da POSIX).
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
esegue il codice per ogni riga e stampa il risultato ( $_
); -l
elimina e aggiunge nuovamente le terminazioni di riga automaticamente; -a
popola @F
con suddivisione in input sul delimitatore impostato -F
, che qui è una stringa vuota. Il risultato è di dividere ogni carattere in @F
, quindi uniscili con '&' e stampa la riga.)
In alternativa:
perl -pe 's/(?<=.)./&$&/g'
(sostituisci ogni carattere a condizione che sia preceduto da un altro personaggio (operatore regexp look-behind (? <= ...))
Utilizzo degli zsh
operatori shell:
in=12345
out=${(j:&:)${(s::)in}}
(di nuovo, dividi su un separatore di campo vuoto usando il s::
flag di espansione dei parametri e unisciti a &
)
O:
out=${in///&} out=${out#?}
(sostituisci ogni ricorrenza di nulla (quindi prima di ogni carattere) con l' &
uso ${var//pattern/replacement}
dell'operatore ksh (anche se in ksh
un modello vuoto significa qualcos'altro, eppure qualcos'altro, non sono sicuro di cosa ci sia dentro bash
), e rimuovi il primo con lo ${var#pattern}
stripping POSIX operatore).
Utilizzo degli ksh93
operatori shell:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
essendo un operatore glob ksh93 per usare espressioni regolari tipo perl (diverso da perl o PCRE), (?=.)
essendo l'operatore look-ahead: sostituisci un personaggio a condizione che sia seguito da un altro personaggio con se stesso ( \0
) e &
)
O:
out=${in//?/&\0}; out=${out#?}
(sostituiamo ogni carattere ( ?
) con &
e se stesso ( \0
) e rimuoviamo quello superflous)
Utilizzo degli bash
operatori shell:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(lo stesso di zsh
's, tranne che avete bisogno di @()
lì (un operatore di ksh glob per il quale è necessario extglob
in bash
)).
awk -F '' -v OFS="&" 'NF=NF'
Utilità Unix:
fold -w1|paste -sd\& -
Ha spiegato:
"fold -w1"
- avvolgerà un carattere di ogni input nella sua riga
piega: avvolge ciascuna riga di input per adattarla alla larghezza specificata
-w, --width = WIDTH usa le colonne WIDTH anziché 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- Unirà le linee di input insieme, usando &
come separatore
incolla: unisce le righe dei file
-s, --serial incolla un file alla volta anziché in parallelo
-d, --delimiters = LIST riutilizza i caratteri da LIST anziché dai TAB
%fold -w1|paste -sd\& -
1&2&3&4&5
(Nota che se l'input contiene più righe, verranno unite &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.
sed
risposte disponibili di seguito. E non vedo alcun danno nel dimostrare come il compito può essere risolto con gli altri mezzi.
"-w"
, grazie! "-"
, a sua volta, non è richiesto If no file operands are specified, the standard input shall be used
sed 's/\B/\&/g'
\ B - Corrisponde ovunque ma su un limite di parole; vale a dire se il carattere a sinistra e il carattere a destra sono entrambi caratteri "parola" o entrambi caratteri "non parola".
Informazioni: manuale GNU sed, estensioni di espressioni regolari .
test:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Questo sarà un po 'più lento di alcune delle altre risposte, ma è abbastanza chiaro:
echo 12345 | perl -lnE 'say join "&", split //'
Ecco un altro modo. La prima parte dell'espressione sed cattura ogni personaggio, poi lo sostituisce con il personaggio e una e commerciale. La seconda parte rimuove la e commerciale dalla fine della linea.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Funziona anche su caratteri multibyte.
sed
due volte, uno sed
script può avere diversi comandi:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
input