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

pra*_*upd 173 bash text-processing

我想解析一个变量(在我的例子中它是开发工具包版本)以使其 dot( .) 免费。如果version='2.3.3',所需的输出是233

我尝试如下,但它需要.替换为另一个给我的字符2_3_3。如果tr . ''能奏效就好了。

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _
Run Code Online (Sandbox Code Playgroud)

man*_*ork 189

无需执行外部程序。bash字符串操作可以处理它(也可以在ksh93(它来自何处)zsh以及mksh,yash和 busybox 的最新版本sh(至少)中可用):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233
Run Code Online (Sandbox Code Playgroud)

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

  • 更详细的,上面答案的语法是`${string//substring/replacement}`,显然缺少最后的正斜杠和替换字符串被解释为*delete*。请参阅[此处](http://tldp.org/LDP/abs/html/string-manipulation.html)。 (43认同)
  • 对了,`man bash` 在 [Shell Parameter Expansion](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion) 部分说得很清楚: “`${parameter/pattern/string}` (...) 如果 _string_ 为空,则删除 _pattern_ 的匹配项,并且可以省略 _pattern_ 后面的 `/`。” (7认同)

Sté*_*las 123

按时间顺序:

t/sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'
Run Code Online (Sandbox Code Playgroud)

csh/tcsh

echo $VERSION:as/.//
Run Code Online (Sandbox Code Playgroud)

POSIX 外壳:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"
Run Code Online (Sandbox Code Playgroud)

ksh93/zsh/mksh/bash/yash(以及ash用 构建时的busybox ASH_BASH_COMPAT

echo "${VERSION//.}"
Run Code Online (Sandbox Code Playgroud)

zsh

echo $VERSION:gs/./
Run Code Online (Sandbox Code Playgroud)


小智 28

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

echo "2.3.3" | tr --delete .
echo "2.3.3" | tr -d .       # for MacOS
Run Code Online (Sandbox Code Playgroud)

这将输出: 233

  • 在 macos 上,无法识别 `--delete` 标志,但您可以使用 `-d` 代替 (10认同)

fdu*_*uff 9

你应该尝试sed,而不是

sed 's/\.//g'


小智 6

echo "$VERSION" | tr -cd [:digit:]
Run Code Online (Sandbox Code Playgroud)

无论存在什么其他字符,都只会返回数字


Ser*_*nyy 5

珀尔

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233
Run Code Online (Sandbox Code Playgroud)

Python

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

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

$ python -c 'print "'$VERSION'".replace(".","")'
233
Run Code Online (Sandbox Code Playgroud)

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

AWK

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

或这个:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
Run Code Online (Sandbox Code Playgroud)