Ответы:
С 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также работает и немного более эффективен во многих реализациях awk, но поведение, когда вы делаете это, в настоящее время не определено POSIX).
perl:
perl -F -lape '$_=join"&",@F'
( -peзапускает код для каждой строки и печатает результат ( $_); -lавтоматически удаляет и повторно добавляет окончания строк; -aзаполняется @Fвходным разделением по заданному разделителю -F, который здесь представляет собой пустую строку. В результате каждый символ разделяется на @F, затем соедините их с '&' и напечатайте строку.)
В качестве альтернативы:
perl -pe 's/(?<=.)./&$&/g'
(заменить каждый символ, если ему предшествует другой символ (оператор регулярного выражения (? <= ...))
Использование zshоператоров оболочки:
in=12345
out=${(j:&:)${(s::)in}}
(снова разделить на пустой разделитель полей, используя s::флаг расширения параметра, и соединиться с &)
Или:
out=${in///&} out=${out#?}
(заменить каждое вхождение ничего (так до каждого символа) с &помощью ${var//pattern/replacement}оператора КШ (хотя в kshпустом шаблоне означает что - то еще, и еще что - то еще, я не уверен , что в bash), и удалить первый с POSIX ${var#pattern}зачистки оператор).
Использование 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, --serial вставлять один файл за раз вместо параллельного
-d, --delimiters = LIST повторно использовать символы из LIST вместо вкладок
%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входе