Ответы:
С 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
входе