`sed`の文字列の文字の間に「&」をどのように配置しますか?

`sed`の文字列の文字の間に「&」をどのように配置しますか?

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}kshNULLパターンに異なるものがあることは異なることを意味しますが、何があるかわかりません)、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演算子を使用する必要があります)。extglobbash

答え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 //'

関連情報