Відповіді:
З GNU sed
:
sed 's/./\&&/2g'
( s
вставте кожен ( g
) символ ( .
) з тим самим ( &
), який передує &
( \&
), але тільки починаючи з другого появи ( 2
)).
Портативно:
sed 's/./\&&/g;s/&//'
(замінюйте кожну подію, але потім видаліть перше, &
чого ми не хочемо).
З деякими awk
реалізаціями (не POSIX, оскільки поведінка не визначено для порожнього FS):
awk -F '' -v OFS="&" '{$1=$1;print}'
(з gawk
кількома іншими awk
реалізаціями, порожній роздільник поля розділяє записи на його складові символи . Розділювач поля виводу ( OFS
) встановлюється &
. Присвоюємо значення $1
(самому), щоб змусити регенерувати запис за допомогою нового роздільника поля. Перш ніж надрукувати його, він NF=NF
також працює і є дещо ефективнішим у багатьох реалізаціях, але поведінка, коли ви це робите, наразі не визначена POSIX).
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
запускає код для кожного рядка та друкує результат ( $_
); -l
знімає та повторно додає закінчення рядків автоматично; -a
заповнюється @F
розділеним введенням на роздільнику -F
, який є порожнім рядком. Результатом є розділення кожного символу на @F
, потім приєднайте їх до "&" та надрукуйте рядок.)
Як варіант:
perl -pe 's/(?<=.)./&$&/g'
(замініть кожен символ за умови, що йому передує інший символ (оглядовий оператор regexp (? <= =))
Використання zsh
операторів оболонки:
in=12345
out=${(j:&:)${(s::)in}}
(знову ж таки, розділіть на порожній роздільник поля, використовуючи s::
прапор розширення параметра, і з'єднайтеся з &
)
Або:
out=${in///&} out=${out#?}
(замініть кожне виникнення нічого (тому перед кожним символом) за &
допомогою ${var//pattern/replacement}
оператора ksh (хоча в ksh
порожньому шаблоні означає щось інше, а ще щось інше, я не впевнений, що в bash
), і видаліть перше з ${var#pattern}
позбавленням POSIX оператор).
Використання ksh93
операторів оболонки:
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
будучи глобальним оператором ksh93, щоб використовувати регулярні вирази, подібні до perl (відмінні від perl чи PCRE), (?=.)
будучи оператором "заздалегідь": замініть символ за умови, що за ним слідує інший символ на себе ( \0
) та &
)
Або:
out=${in//?/&\0}; out=${out#?}
(замінюємо кожен символ ( ?
) на &
і себе ( \0
), а ми видаляємо неперевершений)
Використання bash
операторів оболонки:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
( Такий же , як zsh
«s, за винятком того, що вам потрібно @()
є (а КШ Глоб оператор , для якого вам потрібно extglob
в bash
)).
awk -F '' -v OFS="&" 'NF=NF'
Утиліти Unix:
fold -w1|paste -sd\& -
Пояснили:
"fold -w1"
- прив’яже кожен символ введення до власного рядка
скласти - обернути кожен рядок вводу відповідно до заданої ширини
-w, --width = WIDTH використовувати WIDTH стовпці замість 80
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- об'єднає вхідні рядки разом, використовуючи &
як роздільник
вставити - об'єднати рядки файлів
-s, - послідовна вставка одного файла за раз, а не паралельно
-d, --delimiters = СПИСОК повторного використання символів зі списку замість TAB
%fold -w1|paste -sd\& -
1&2&3&4&5
(Зверніть увагу, що якщо вхід містить кілька рядків, вони будуть об'єднані &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.
sed
відповідей. І я не бачу ніякої шкоди в демонстрації того, як завдання можна вирішити іншими способами.
sed 's/\B/\&/g'
\ B - відповідність скрізь, але на межі слова; тобто це збігається, якщо символ зліва та символ праворуч є або символами «слова», або обома символами «не слова».
Інформація: посібник GNU sed, регулярні розширення виразів .
Тестування:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Це буде трохи повільніше, ніж деякі відповіді, але це цілком зрозуміло:
echo 12345 | perl -lnE 'say join "&", split //'
Ось ще один спосіб. Перша частина виразу sed фіксує кожного символу, а потім замінює його символом та символом. Друга частина видаляє амперсанд від кінця рядка.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Працює і на багатобайтових символах.
sed
двічі, sed
сценарій може мати кілька команд:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
вході