我有一个号码 -> 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
只是使用 perl 而不是 awk 或 sed 的其他一些可能性:
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