如何选择两个''之间的子串

时间:2011-08-11 05:11:36

标签: bash

我正在处理一个接收这种格式的字符串的脚本:

ACTIVE            '/dev/xenlvm/backups' [20.00 GiB] inherit

我需要在''之间的子串,所以/ dev / xenlvm / backups

我知道我可以使用## *运算符和%%,但我一直使用字符作为[]。如果我的分隔符是'?

,我如何指定它
tmp=${var##*[}
echo "${tmp%%]*}"

非常感谢;)

4 个答案:

答案 0 :(得分:2)

另一种方法是使用内置的read shell。执行外部命令通常会更快。

bash-4.2$ tmp="ACTIVE            '/dev/xenlvm/backups' [20.00 GiB] inherit"
bash-4.2$ IFS="'" read path path blah <<< "$tmp"
bash-4.2$ echo "$path"
/dev/xenlvm/backups

答案 1 :(得分:2)

逃避它?

$ tmp="ACTIVE            '/dev/xenlvm/backups' [20.00 GiB] inherit"
$ echo $tmp
ACTIVE '/dev/xenlvm/backups' [20.00 GiB] inherit
$ tmp="${tmp#*\'}"
$ echo $tmp
/dev/xenlvm/backups' [20.00 GiB] inherit
$ tmp="${tmp%\'*}"
$ echo $tmp
/dev/xenlvm/backups

答案 2 :(得分:0)

您可以使用cut

  

剪切 - 剪切文件每行的选定字段

单引号在这里是自然分隔符,所以像这样:

path=$(echo $stuff | cut -f2 -d"'")

当然,这假设您不必处理嵌套或转义的单引号。

答案 3 :(得分:0)

如果您的字符串变化超过原始描述,那么您将需要正则表达式。我会使用像

这样的东西
echo $line_of_file | sed -n -e "/ACTIVE/ s|.*'\(.*\)'.*|\1|p"