
電話番号があります - > 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