Kann sed
so etwas machen wie:
12345
werden:
1&2&3&4&5
?
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
)).
012345
Eingabe nicht funktionierenawk -F '' -v OFS="&" 'NF=NF'
Unix-Dienstprogramme:
Erklärt:
"fold -w1"
- umschließt jedes eingegebene Zeichen mit einer eigenen Zeile"paste -sd\& -"
- führt die Eingabezeilen zusammen und verwendet sie&
als Trennzeichen(Beachten Sie, dass wenn die Eingabe mehrere Zeilen enthält, diese mit verbunden werden.
&
)quelle
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 erforderlichIf no file operands are specified, the standard input shall be used
Verwenden
sed
quelle
Information: GNU sed Handbuch, reguläre Ausdruckserweiterungen .
Testen:
quelle
Dies wird etwas langsamer sein als einige der anderen Antworten, aber es ist ziemlich klar:
quelle
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.
Funktioniert auch mit Multibyte-Zeichen.
quelle
sed
zweimal aufrufen , einsed
Skript kann mehrere Befehle enthalten:sed -r 's/(.)/\1\&/g; s/\&$//g'