各文字の後に特定の文字を追加するには?

各文字の後に特定の文字を追加するには?

電話番号があります - > 12345

次の形式で出力したいと思います。

1+2+3+4+5

echo `cat fl.txt | paste -s -d ''`

12345.

しかし、以下のコマンドに+を追加すると同じ12345

echo `cat fl.txt | paste -s -d '' | tr -s '' '+'`

答え1

GNU sedを使用すると、次のこともできます。

sed 's/./+&/2g'

答え2

文字列を文字に分割する方が簡単です。

fold -w1 file | paste -sd+ -

一部のコマンドバージョンにはfoldこのオプションはありませんが、-cこのオプションがあります-w。この場合は、互いに置き換えて使用できます。
または:

grep -o '.' file | paste -sd+ -

たぶん、次のコマンドを使用できます。

awk -v OFS='+' -F '' '{$1=$1; print}' file

そして:

sed 's/\B/+/g' file

答え3

そしてzsh

$ number=12345
$ printf '%s\n' ${(j[+])${(s[])number}}
1+2+3+4+5

s[]パラメータ拡張フラグは$number文字コンポーネントに分割されます。j[+]彼らと一緒に戻ってください+

そしてbash

$ number=12345
$ shopt -s extglob
$ tmp=${number//@()/+}
$ printf '%s\n' "${tmp#+}"
1+2+3+4+5

${number//@()/+}次の項目をすべて置き換えます。何もないそして+。何らかの理由で${number///+}動作しないようですbash(しかし動作しますzsh)。

答え4

awkやsedの代わりにperlを使う他の可能性もあります。

echo 12345 | perl -lpe '$_ = join "+", split //;'

または(番号がに保存されている場合fl.txt

# echo 12345 > fl.txt
perl -lpe '$_ = join "+", split //;' fl.txt

パラメーターには、単に行末(「+」で連結されている場合)は-l含まれません。それ以外の場合は、この結果が得られます1+2+3+4+5+

または、既に述べた sed 方法と同様の方法を使用できます。

perl -pe 's/.\K/+/g; s/\+$//;' fl.txt

または

perl -pe 's/.\K(?!$)/+/g;' fl.txt

または

perl -pe 's/\B/+/g;' fl.txt

すべての場合の出力:

1+2+3+4+5

関連情報