Bash - 获取两个字符之间的字符串

3

如何在bash中获取两个特定字符之间的字符串(不使用grep或sed)?

例如:

input=hostname~web:sit

我希望从上述输入中提取 web

${hostname#*~} 的输出结果是 web:sit,但我只需要输出结果中的 web

从其他帖子中可以看到

% 从 $var 的结尾开始删除到指定模式的字符。但不确定如何应用它。

请帮忙解决,谢谢!


1
尝试使用sed -E 's/.*~([^:]+):.*/\1/' <<< "$input" - undefined
awk -F '[~:]' '{print $2}' <<< "$input" - undefined
没有问题不能与其他问题相同,因为另一个问题明确要求使用grep。 - undefined
很遗憾,这也不正确,因为这是在问如何在sed/grep中实现。请理解bash是一种不同的语言,而grep/sed/awk则是另一种。 - undefined
是的,我明白sed、grep和bash之间有区别。在这个bash问题上给出一个sed答案有点矛盾。 - undefined
显示剩余4条评论
3个回答

3

使用 extglobbash 中,你可以用一步完成以下操作:

shopt -s extglob
input='hostname~web:sit'
echo "${input//@(*~|:*)/}"

web

这里的@(*~|:*)匹配从开头到~字符或从:到结尾的子字符串。使用//,我们将所有这样的实例替换为空字符串。


还有一个sed解决方案:

sed -E 's/.*~([^:]+):.*/\1/' <<< "$input"

web

谢谢你的回答,当我尝试这些命令时,echo会将输入打印回来,而不是web - undefined
抱歉,我在回答中漏掉了复制shopt行的部分。请尝试现在更新的答案。 - undefined

2

请分两步进行:

input=hostname~web:sit

rightpart=${input#*~}   # remove prefix up to "~" (included)
output=${rightpart%:*}  # remove suffix from ":" (included)

echo $output

2

另一个选项是使用cut,它可从GNU Core Utilities获得:

  1. 获取~后面的所有内容
  2. 获取:前面的所有内容
input='hostname~web:sit'
echo "$input" | cut -d '~' -f2 | cut -d ':' -f1
# web

在线试用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接