如何用第三个 .(dot) 分隔符分割字符串

Tig*_*ger 8 shell bash string split

我做了一些研究,我可以用 '.' 分割字符串。但我唯一想要替换的是第三个“.”,并且版本号实际上是可变的,所以我该如何进行替换/拆分?

version: 1.8.0.110
Run Code Online (Sandbox Code Playgroud)

但我想要的是这样的输出:

version: 1.8.0-110
Run Code Online (Sandbox Code Playgroud)

Ned*_*d64 34

使用sed例如:

$ echo 'version: 1.8.0.110' | sed 's/\./-/3'
version: 1.8.0-110
Run Code Online (Sandbox Code Playgroud)

解释:

sed s/search/replace/x搜索一个字符串并替换第二个。x确定要替换哪个出现 - 这里是第 3 次。通常g用于x表示所有事件。

这里我们希望替换点,.但这是正则表达式sed中的一个特殊字符,期望在search术语中。因此,我们将.to反斜杠\.以指定文字.

由于我们在参数中使用了特殊字符sed(这里是反斜杠\),我们需要将整个参数放在单引号中''。许多人总是在这里使用引号,以免在使用 shell 可能特殊的字符(如空格)时遇到问题。


hac*_*rb9 5

使用bash

您不需要外部程序来执行此操作,特别是因为您似乎想用破折号替换最后一个句点。Bash 本身可以处理字符串操作。

假设你有

vers='version: 1.8.0.110'
Run Code Online (Sandbox Code Playgroud)

答案很简单:

vers='version: 1.8.0.110'
Run Code Online (Sandbox Code Playgroud)

% 表示删除右侧匹配的最短字符串。## 表示删除左侧匹配的最长字符串。

如果超过三个周期怎么办?

如果你真的想替换第三个句点,而不是我上面假设的最后一个句点,那么在 bash 中它会变得有点棘手,但它仍然是可能的。例如,如果vers='version: 1.8.0.110.hut.hut.hut.hike!',您可以找到第三个句点之后的所有内容并使用它来截断字符串:

$ end=${vers#*.*.*.}
$ start=${vers%$end}
$ echo ${start%.}-$end
version: 1.8.0-110.hut.hut.hut.hike!
Run Code Online (Sandbox Code Playgroud)

另一种方法:使用 IFS 将字符串拆分为 bash 数组

虽然这对于这个问题来说有点过分了,但有时将字符串拆分为多个组件并将它们加载到数组中是有用的。

IFS=. read -a foo <<<'version: 1.8.0.110.hut.hut.hut.hike!'
Run Code Online (Sandbox Code Playgroud)

您可以迭代数组$foo并选择何时打印内容。例如,

echo -n $foo
for ((i=1; i<${foo[@]}; i++)); do 
  [[ i -eq 3 ]] && echo -n - || echo -n .
  echo -n ${foo[i]};
done
echo
Run Code Online (Sandbox Code Playgroud)