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

在shell脚本中查找和替换(特殊字符),shell,sh,Shell,Sh,我不熟悉shell脚本: 我有以下建议: old=/dev/sda new=/dev/sda5 给定这些变量,我需要从“new”字符串中提取5 我该怎么做呢sedawk 尝试使用: partitionno=$(echo $new | sed 's/$old//g') 要以最少的命令更改获得正确的结果,请尝试: partitionno=$(echo "$new" | sed "s|$old||g") 这里有两个关键点: Shell变量不在单引号内展开。因此,“$old”保留原来的四个字符:$

我不熟悉shell脚本:

我有以下建议:

old=/dev/sda
new=/dev/sda5
给定这些变量,我需要从“new”字符串中提取
5

我该怎么做呢<代码>sed<代码>awk

尝试使用:

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

要以最少的命令更改获得正确的结果,请尝试:

partitionno=$(echo "$new" | sed "s|$old||g")
这里有两个关键点:

  • Shell变量不在单引号内展开。因此,
    “$old”
    保留原来的四个字符:
    $
    o
    l
    d
    。对于要展开的shell变量,请使用双引号

  • sed“s/$old//g”
    仍然无法工作,因为斜杠太多了。替换命令使用三个斜杠。shell展开后,
    $old
    ,有五个斜杠。解决方案是为替换命令使用不同的分隔符。我在上面选择了
    |
    ,因为
    |
    不太可能在文件名中

  • 使用:

    ${parameter#word}

    ${parameter##word}

    该词被展开以产生一种模式,就像在文件名展开中一样(请参见文件名展开)。如果模式匹配参数扩展值的开头,则扩展的结果是删除了最短匹配模式(“大小写”)或最长匹配模式(“大小写”)的参数扩展值。如果参数为“@”或“”,则模式删除操作将依次应用于每个位置参数,展开为结果列表。如果参数是下标为“@”或“”的数组变量,则模式删除操作将依次应用于数组的每个成员,展开为结果列表

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