在shell脚本中查找和替换(特殊字符)

时间:2015-01-23 20:31:57

标签: shell sh

我是shell脚本的新手:

我有以下内容:

old=/dev/sda
new=/dev/sda5

鉴于这些变量,我需要从“new”字符串中提取5

我应该怎么做? sedawk

尝试使用:

partitionno=$(echo $new | sed 's/$old//g')

2 个答案:

答案 0 :(得分:3)

要在命令变化最小的情况下获得正确的结果,请尝试:

partitionno=$(echo "$new" | sed "s|$old||g")

这里有两个关键点:

  1. Shell变量不会在单引号内展开。因此,'$old'仍然是原始的四个字符:$old。要扩展shell变量,请使用双引号。

  2. sed "s/$old//g"仍然无法工作,因为有太多的斜杠。替换命令使用三个斜杠。 shell扩展$old后,有五个斜杠。解决方案是为substitute命令使用不同的分隔符。我之所以选择|,是因为|不太可能是文件名。

答案 1 :(得分:1)

使用Shell Parameter Expansion

$ old=/dev/sda
$ new=/dev/sda5
$ echo "${new#$old}"
5
  

$ {参数#字}

     

$ {参数##字}

     

这个词被扩展为产生一个模式,就像文件名扩展一样(参见文件名扩展)。如果模式匹配参数的扩展值的开头,则扩展的结果是具有最短匹配模式('#'大小写)或最长匹配模式('##'大小写)的参数的扩展值删除。如果参数是'@'或'',则模式删除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是使用'@'或''下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。