Antworten:
Mit GNU sed
:
sed 's/./\&&/2g'
( s
Ersetzen Sie jedes ( g
) Zeichen ( .
) durch dasselbe ()&
) vor &
( \&
), jedoch erst ab dem zweiten Vorkommen ( 2
)).
Tragbar:
sed 's/./\&&/g;s/&//'
(Ersetzen Sie jedes Vorkommen, aber entfernen Sie dann das erste, &
das wir nicht wollen).
Bei einigen awk
Implementierungen (nicht POSIX, da das Verhalten für einen leeren FS nicht angegeben ist):
awk -F '' -v OFS="&" '{$1=$1;print}'
(Mit gawk
und einigen anderen awk
Implementierungen teilt ein leeres Feldtrennzeichen die Datensätze in ihre Zeichenbestandteile auf . Das Ausgabefeldtrennzeichen ( OFS
) ist auf gesetzt &
. Wir weisen einen Wert zu$1
(selbst) zu erzwingen, dass der Datensatz mit dem neuen Feldtrennzeichen neu generiert wird vor dem Drucken NF=NF
funktioniert auch und ist in vielen awk-Implementierungen etwas effizienter, aber das Verhalten, wenn Sie dies tun, ist derzeit von POSIX nicht spezifiziert.
perl
::
perl -F -lape '$_=join"&",@F'
( -pe
führt den Code für jede Zeile aus und druckt das Ergebnis aus ( $_
); entfernt -l
und fügt Zeilenenden automatisch wieder hinzu; -a
füllt die @F
Eingabe mit dem eingegebenen Trennzeichen -F
, das hier eine leere Zeichenfolge ist. Das Ergebnis besteht darin, jedes Zeichen in zu teilen@F
: Verbinden Sie sie dann mit '&' und drucken Sie die Zeile aus.)
Alternative:
perl -pe 's/(?<=.)./&$&/g'
(Ersetzen Sie jedes Zeichen, sofern ihm ein anderes Zeichen vorangestellt ist (Rückblick-Regexp-Operator (? <= ...)).
Verwenden von zsh
Shell-Operatoren:
in=12345
out=${(j:&:)${(s::)in}}
(Teilen Sie erneut ein leeres Feldtrennzeichen mit dem s::
Parameter-Erweiterungsflag auf und verbinden Sie sich mit&
)
Oder:
out=${in///&} out=${out#?}
(Ersetzen Sie jedes Vorkommen von nichts (also vor jedem Zeichen) durch die &
Verwendung des ${var//pattern/replacement}
ksh-Operators (obwohl ksh
ein leeres Muster etwas anderes bedeutet, und noch etwas anderes, ich bin mir nicht sicher, was drin ist bash
), und entfernen Sie das erste mit dem POSIX- ${var#pattern}
Stripping Operator).
Verwenden von ksh93
Shell-Operatoren:
in=12345
out=${in//~(P:.(?=.))/\0&}
(Als ~(P:perl-like-RE)
ksh93-Glob-Operator, der perlähnliche reguläre Ausdrücke verwendet (allerdings anders als bei Perls oder PCREs), (?=.)
als Look-Ahead-Operator: Ersetzen Sie ein Zeichen, sofern ihm ein anderes Zeichen folgt, durch sich selbst ( \0
) und &
)
Oder:
out=${in//?/&\0}; out=${out#?}
(Ersetzen Sie jedes Zeichen ( ?
) durch &
und sich selbst ( \0
), und wir entfernen das überflüssige)
Verwenden von bash
Shell-Operatoren:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
( das gleiche wie zsh
‚s, mit der Ausnahme , dass Sie braucht @()
es (a KSH glob Operator für die Sie brauchen extglob
in bash
)).
awk -F '' -v OFS="&" 'NF=NF'
Unix-Dienstprogramme:
fold -w1|paste -sd\& -
Erklärt:
"fold -w1"
- umschließt jedes eingegebene Zeichen mit einer eigenen Zeile
Falten - Wickeln Sie jede Eingabezeile so, dass sie in die angegebene Breite passt
-w, --width = WIDTH Verwenden Sie WIDTH-Spalten anstelle von 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- führt die Eingabezeilen zusammen und verwendet sie &
als Trennzeichen
Einfügen - Zeilen von Dateien zusammenführen
-s, --serial Einfügen einer Datei nach der anderen anstatt parallel
-d, --delimiters = LIST verwendet Zeichen aus LIST anstelle von TABs wieder
%fold -w1|paste -sd\& -
1&2&3&4&5
(Beachten Sie, dass wenn die Eingabe mehrere Zeilen enthält, diese mit verbunden werden. &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.
sed
Antworten unten. Und ich sehe keinen Schaden darin, zu demonstrieren, wie die Aufgabe auf andere Weise gelöst werden kann.
"-w"
, danke! "-"
wiederum ist nicht erforderlich If no file operands are specified, the standard input shall be used
sed 's/\B/\&/g'
\ B - Stimmt überall überein, außer an einer Wortgrenze. Das heißt, es stimmt überein, wenn das Zeichen links und das Zeichen rechts entweder beide "Wort" -Zeichen oder beide "Nicht-Wort" -Zeichen sind.
Information: GNU sed Handbuch, reguläre Ausdruckserweiterungen .
Testen:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Dies wird etwas langsamer sein als einige der anderen Antworten, aber es ist ziemlich klar:
echo 12345 | perl -lnE 'say join "&", split //'
Hier ist ein anderer Weg. Der erste Teil des sed-Ausdrucks erfasst jedes Zeichen und ersetzt dieses durch das Zeichen und ein kaufmännisches Und. Der zweite Teil entfernt das kaufmännische Und vom Zeilenende.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Funktioniert auch mit Multibyte-Zeichen.
sed
zweimal aufrufen , ein sed
Skript kann mehrere Befehle enthalten:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
Eingabe nicht funktionieren