Можно sed
сделать что-то вроде:
12345
стали :
1&2&3&4&5
?
С 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
)).
012345
входеawk -F '' -v OFS="&" 'NF=NF'
Unix утилиты:
Разъяснение:
"fold -w1"
- перенесет каждый входной символ в свою строку"paste -sd\& -"
- объединит входные строки вместе, используя&
в качестве разделителя(Обратите внимание, что если вход содержит несколько строк, они будут объединены с
&
)источник
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.sed
ответов, доступных ниже. И я не вижу никакого вреда в демонстрации того, как эта задача может быть решена другими средствами."-w"
, спасибо!"-"
, В свою очередь, не требуетсяIf no file operands are specified, the standard input shall be used
использование
sed
источник
Информация: руководство по GNU sed, расширения регулярных выражений .
Тестирование:
источник
Это будет немного медленнее, чем некоторые другие ответы, но это довольно ясно:
источник
Вот другой способ. Первая часть выражения sed фиксирует каждый символ, а затем заменяет его символом и амперсандом. Вторая часть удаляет амперсанд с конца строки.
Работает и с многобайтовыми символами.
источник
sed
дважды,sed
скрипт может иметь несколько команд:sed -r 's/(.)/\1\&/g; s/\&$//g'