Może sed
zrobić coś takiego:
12345
stają się :
1&2&3&4&5
?
Z GNU sed
:
sed 's/./\&&/2g'
( s
Ubstitute każdy ( g
) znak ( .
) z tym samym ( &
) poprzedzone &
( \&
), ale dopiero od drugiego wystąpienia ( 2
)).
Przenośny:
sed 's/./\&&/g;s/&//'
(zamień każde wystąpienie, ale następnie usuń pierwsze, &
którego nie chcemy).
W przypadku niektórych awk
implementacji (nie POSIX, ponieważ zachowanie nie jest określone dla pustego FS):
awk -F '' -v OFS="&" '{$1=$1;print}'
(z gawk
kilkoma innymi awk
implementacjami, pusty separator pól dzieli rekordy na składniki znakowe . Separator pól wyjściowych ( OFS
) jest ustawiony na &
. Przypisujemy wartość do $1
(samej), aby wymusić odtworzenie rekordu za pomocą nowego separatora pól przed wydrukowaniem NF=NF
działa również i jest nieco bardziej wydajny w wielu implementacjach awk, ale zachowanie, kiedy to robisz, nie jest obecnie określone przez POSIX).
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
uruchamia kod dla każdego wiersza i wypisuje wynik ( $_
); automatycznie -l
usuwa paski i ponownie dodaje zakończenia wierszy; -a
wypełnia @F
się wprowadzonym podziałem wejściowym w ustawionym ograniczniku -F
, który tutaj jest pustym ciągiem. Wynikiem jest podzielenie każdego znaku na @F
, następnie połącz je za pomocą „&” i wydrukuj wiersz).
Alternatywnie:
perl -pe 's/(?<=.)./&$&/g'
(zamień każdy znak, pod warunkiem, że poprzedza go inny znak (patrz operator wyrażenia regularnego (? <= ...))
Korzystanie z zsh
operatorów powłoki:
in=12345
out=${(j:&:)${(s::)in}}
(ponownie podziel na pusty separator pól przy użyciu s::
flagi rozwijania parametrów i połącz się z &
)
Lub:
out=${in///&} out=${out#?}
(zastąpić każde wystąpienie nic (tak przed każdym znaku) z &
użyciem ${var//pattern/replacement}
operatora ksh (choć w ksh
pustym środki wzór czegoś innego, a jeszcze coś innego, nie jestem pewien, co w bash
) i wyjąć pierwszy z POSIX ${var#pattern}
stripping operator).
Korzystanie z ksh93
operatorów powłoki:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
będąc operatorem globalnym ksh93, który używa wyrażeń regularnych podobnych do perla (różniących się od perla lub PCRE), (?=.)
będąc operatorem wybiegającym w przyszłość: zamień znak pod warunkiem, że następuje po nim inny znak ze sobą ( \0
) i &
)
Lub:
out=${in//?/&\0}; out=${out#?}
(zamień każdy znak ( ?
) na &
i sama ( \0
), a my usuniemy zbędny)
Korzystanie z bash
operatorów powłoki:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(to samo co zsh
„s, z wyjątkiem, że trzeba @()
tam (operator ksh glob, dla którego trzeba extglob
w bash
)).
012345
danych wejściowychawk -F '' -v OFS="&" 'NF=NF'
Narzędzia uniksowe:
Wyjaśnione:
"fold -w1"
- zawinie każdy znak wejściowy do własnej linii"paste -sd\& -"
- scali linie wejściowe razem, używając&
jako separatora(Uwaga: jeśli dane wejściowe zawierają kilka wierszy, zostaną połączone
&
)źródło
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.sed
poniżej znajduje się wiele dobrych odpowiedzi. I nie widzę żadnej szkody w demonstrowaniu, jak zadanie można rozwiązać innymi sposobami."-w"
, dzięki!"-"
z kolei nie jest wymaganeIf no file operands are specified, the standard input shall be used
Posługiwać się
sed
źródło
Informacja: Podręcznik GNU sed, rozszerzenia wyrażeń regularnych .
Testowanie:
źródło
To będzie trochę wolniejsze niż niektóre inne odpowiedzi, ale jest całkiem jasne:
źródło
Oto inny sposób. Pierwsza część wyrażenia sed przechwytuje każdą postać, a następnie zastępuje ją znakiem i znakiem ampersand. Druga część usuwa znaki handlowe i koniec linii.
Działa również na znakach wielobajtowych.
źródło
sed
dwa razy,sed
skrypt może mieć kilka poleceń:sed -r 's/(.)/\1\&/g; s/\&$//g'