使用bash从变量中删除特定字符


122

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

我尝试如下进行操作,但是.必须替换为另一个给我的字符2_3_3。如果tr . ''可以的话,那会很好。

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

10
不,它不需要:echo "2.3.3" | tr -d .
manatwork 2013年

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

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

1
@Rmano您的意思是VERSION='2.30.3100'?无论是什么.,所有答案都将被删除。
prayagupd

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

Answers:


135

无需执行外部程序。bash字符串操作可以处理它(也可以在ksh(来源)和中使用zsh):

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

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


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

5
正确,man bash在“ Shell参数扩展”部分明确指出:“ ${parameter/pattern/string}(...)如果字符串为null,则删除模式匹配项,并且可以省略/以下模式。”
manatwork 2016年

1
我的问题是版本号是这样的 "1.0.0",我只需要编号,所以请按照@manatwork建议的方式进行更改:"${VERSIONNUM//'"'}"但是,我插入' ' 它是因为否则无法识别""类似的字符串。
Alexiscanny

1
@Alexiscanny,您的意思"是值中包含文字吗?恐怕这算作新问题,但请尝试避免使用双引号:"${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork 2013年

1
高超!!工作在-ash呢!
Fr0zenFyr

87

按时间顺序:

tr / sed

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

csh / tcsh

echo $VERSION:as/.//

POSIX外壳:

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

KSH / zsh的/庆典/佳日(和busybox的ash时候,内置ASH_BASH_COMPAT

echo "${VERSION//.}"

sh

echo $VERSION:gs/./

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

20

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

echo "2.3.3" | tr --delete .

将输出: 233


6
在macOS上,该--delete标志未被识别,但是您可以-d改用
Anentropic

6

你应该尝试sed,而不是

sed 's/\.//g'


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

不管存在什么其他字符,都只会返回数字


4

佩尔

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

蟒蛇

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.