我正在处理一个接收这种格式的字符串的脚本:
ACTIVE '/dev/xenlvm/backups' [20.00 GiB] inherit
我需要在''之间的子串,所以/ dev / xenlvm / backups
我知道我可以使用## *运算符和%%,但我一直使用字符作为[]。如果我的分隔符是'?
,我如何指定它tmp=${var##*[}
echo "${tmp%%]*}"
非常感谢;)
答案 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"