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 可能特殊的字符(如空格)时遇到问题。
您不需要外部程序来执行此操作,特别是因为您似乎想用破折号替换最后一个句点。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=. 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)