我想解析一个变量(在我的情况下,它是开发套件的版本)以使其免于点号(.)。如果version='2.3.3',所需的输出是233

我尝试如下,但是它要求.被替换为另一个字符2_3_3。如果tr . ''可以工作,那就很好。

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _


评论

不,它不需要:echo“ 2.3.3” | tr -d ..

@manatwork很好,有效。您可以将其发布为答案。谢谢

很多好的答案。但是,如果我可以对目标进行第二次猜测,请注意2.11.3和2.1.13 ... ;-)考虑在数字上添加填充零。

@Rmano您的意思是类似VERSION ='2.30.3100'吗?无论是什么,都将在此处将所有答案删除。

@PrayagUpd ---我只是说,如果您将转换后的数字用于比较(比如说“此版本是更新的还是相同的”),则应注意2.11.3和2.1.13- -去除点后它们看起来相同,但是显然2.11.3是更新的。同样,2.11.3比2.1.14更新,但是比较2113和2114将导致错误的答案。我记得某个地方有个错误...

#1 楼

无需执行外部程序。 bash的字符串操作可以处理它(也可以在ksh93(从何处获得),zshmksh的最新版本,yash和busybox sh(至少)):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233


(在那些shell的手册中,通常可以在参数扩展部分中找到它。)

评论


更详细的说,上述答案的语法是$ {string // substring / replacement},其中显然缺少最后的正斜杠和替换字符串被解释为delete。看这里。

– sherrellbc
16年1月6日在18:19



是的,man bash在Shell Parameter Expansion部分中明确指出:“ $ {parameter / pattern / string}(...)如果string为null,则删除模式匹配项,并且/后面的模式可以省略。”

–manatwork
16年1月6日在18:49



我的问题是版本号像这样的“ 1.0.0”,而我只想要该数字,因此请遵循@manatwork建议的更改:“ $ {VERSIONNUM //'”'}“”,但是我什至插入'',因为否则它不会识别出像字符串一样的“”起飞。

–́Alexiscanny
16/09/14在12:53



@Alexiscanny,您的意思是值中存在文字“?这恐怕算作新问题了,但请尝试转义使用双引号:“ $ {VERSIONNUM // \”}“ pastebin.com/3ECDtkwH

–manatwork
16-09-14在13:03

高超!!也可以在-ash上运行!

–Fr0zenFyr
17年1月4日在11:33

#2 楼

按时间顺序:

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'


csh / tcsh

echo $VERSION:as/.//


POSIX外壳:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"


ksh93 / zsh / mksh / bash / yash(和ash配合使用busybox ASH_BASH_COMPAT) br />
zsh

echo "${VERSION//.}"


评论


tr -d甚至删除了集合中的单个字符。对于Ex,我想从“ DCC_VersionD”中删除DCC_,它将删除DCC和D。预期输出:VersionD。实际输出:版本。 sed的魅力十足。 :)感谢您的帖子。

–凯尔
18年5月21日在11:30

#3 楼

除了成功的答案之外,已经存在。使用tr--delete选项也可以实现相同的效果。

评论


在macOS上,无法识别--delete标志,但可以使用-d代替

–熵
18年4月5日在17:40

#4 楼

您应该改用sed

sed 's/\.//g'

#5 楼

echo "$VERSION" | tr -cd [:digit:]


不管是否存在其他字符,都将仅返回数字

评论


仅在当前目录中没有名为:,d,i,g或t的文件并且您使用的shell不会抱怨不匹配的glob并留下它们(大多数为Bourne类和rc类)或不支持水珠的贝壳(如鱼)。

–StéphaneChazelas
20-05-29在15:17

#6 楼

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233


Python

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233


如果$VERSION仅包含数字和点,我们可以做的更短:

$ python -c 'print "'$VERSION'".replace(".","")'
233


(请注意,这是一个代码注入漏洞,尽管$VERSION可能包含任何字符)。

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233


或者这个:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233