回答:
GNUの場合sed
:
sed 's/./\&&/2g'
(s
ubstitute毎(g
)文字(.
)と同じと(&
)で始まる&
(\&
)だけ第二の発生(から始まります2
))。
ポータブル:
sed 's/./\&&/g;s/&//'
(すべての出現箇所を置き換えますが、不要なものを最初に削除し&
ます)。
一部のawk
実装では(動作は空のFSに対して指定されていないため、POSIXではありません):
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#?}
(何もないすべての文字の前に)ksh演算子を&
使用して置換します(空のパターンは他の何かを意味しますが、何か他のものを意味しますが、私はの内容がわかりません)、最初のものをPOSIX ストリッピングで削除しますオペレーター)。${var//pattern/replacement}
ksh
bash
${var#pattern}
ksh93
シェル演算子を使用する:
in=12345
out=${in//~(P:.(?=.))/\0&}
(~(P:perl-like-RE)
perlのような正規表現を使用するksh93 glob演算子(perlやPCREとは異なります)、(?=.)
先読み演算子:文字の後に別の文字が続く場合はそれ自体を置き換えます(\0
)および&
)
または:
out=${in//?/&\0}; out=${out#?}
(すべての文字(?
)を&
and自体(\0
)に置き換え、スーパーフロースの文字を削除します)
bash
シェル演算子を使用する:
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(同じzsh
あなたが必要とすることを除いて、の@()
が(あなたが必要があるためkshのグロブ演算子extglob
でbash
))。
awk -F '' -v OFS="&" 'NF=NF'
Unixユーティリティ:
fold -w1|paste -sd\& -
説明:
"fold -w1"
-各入力文字を独自の行にラップします
fold-指定された幅に収まるように各入力行を折り返します
-w、-width = WIDTHは、80ではなくWIDTH列を使用します
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- &
セパレータとして使用して、入力行をマージします
貼り付け-ファイルの行をマージ
-s、--serial並列ではなく一度に1つのファイルを貼り付け
-d、--delimiters = LIST TABの代わりにLISTの文字を再利用します
%fold -w1|paste -sd\& -
1&2&3&4&5
(入力に複数の行が含まれている場合、それらはで結合されます&
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
。
sed
以下に利用可能な多くの良い答えがあります。また、他の方法でタスクを解決する方法を説明しても害はありません。
"-w"
。 "-"
は必要 ありませんIf no file operands are specified, the standard input shall be used
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式の最初の部分はすべての文字をキャプチャし、それを文字とアンパサンドに置き換えます。2番目の部分は、行の終わりからアンパサンドを削除します。
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
マルチバイト文字でも機能します。
sed
2回呼び出す必要はありません。sed
スクリプトにはいくつかのコマンドがありますsed -r 's/(.)/\1\&/g; s/\&$//g'
012345
入力