sed
次のようにすることができます:
12345
次のようになります。
1&2&3&4&5
?
答え1
GNUの使用sed
:
sed 's/./\&&/2g'
(s
代替()の前に同じ(g
)があるすべての()文字は、()の2番目の発生から始まります。.
&
&
\&
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演算子を使用して(各文字の前に)すべての項目を置き換え、${var//pattern/replacement}
(ksh
NULLパターンに異なるものがあることは異なることを意味しますが、何があるかわかりません)、POSIXストリッピングを使用して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#?}
?
(各文字()を&
独自の文字()に置き換えてから、追加の\0
文字を削除します。)
bash
シェル演算子を使用します。
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(と同じzsh
ですが、そこにある必要があります(@()
でksh glob演算子を使用する必要があります)。extglob
bash
答え2
Unixユーティリティ:
fold -w1|paste -sd\& -
説明する:
"fold -w1"
- 各入力文字を独自の行で囲みます。
折りたたみ - 指定された幅に合わせて各入力行を巻きます。
-w, --width=WIDTH は、80 の代わりに WIDTH 列を使用します。
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- 入力ラインを一緒にマージして&
区切り記号として使用
貼り付け - ファイル行のマージ
-s、--serial並列ではなく一度に1つのファイルを貼り付けます。
-d, --delimiters=LIST タブの代わりに LIST の文字を再利用します。
%fold -w1|paste -sd\& -
1&2&3&4&5
(入力に複数の行が含まれている場合は結合されます&
。)
答え3
使用sed
sed 's/./&\&/g;s/.$//'
答え4
これは他の答えより少し遅いですが、はっきりしています。
echo 12345 | perl -lnE 'say join "&", split //'