sed 参数的 Bash 字符串替换:Sed:未知命令:“”

sed 参数的 Bash 字符串替换:Sed:未知命令:“”

我正在尝试在 .bashrc 中创建一个函数来运行此命令:

lspci -kvnn | sed -n '/VGA/,/^$/ p'

,其中VGA将替换为第一个参数$1

这就是我想出的:

lsp(){
    sed_str="'/$1/,/^$/ p'"
    echo $sed_str
    lspci -kvnn | sed -n $sed_str
    return
}
export -f lsp

我无法理解为什么该函数失败,echo $sed_str(用于故障排除)输出看起来与第一个命令中的正则表达式完全相同。sed 仍然在抱怨:

[user@linux ~]$ lsp VGA
'/VGA/,/^$/ p'
sed: -e expression #1, char 1: unknown command: `''
[user@linux ~]$ 

可能有一些明显的东西我在这里没有看到。

内核和外壳:

uname -r      -> 5.8.14-arch1-1
echo $SHELL   -> /bin/bash

答案1

字符串中包含引号,而不仅仅是分隔字符串。您需要使用引号来定义字符串并使用它:

lsp(){
    sed_str="/$1/,/^$/ p"
    echo $sed_str
    lspci -kvnn | sed -n "$sed_str"
    return
}
export -f lsp

答案2

>>> sed_str="/$1/,/^\$/p"

>>>> lspci -kvnn | sed -n "$sed_str" 
    

单引号是麻烦的根源。此外,您还需要对变量加双引号, $sed_str 以保护它在扩展后免受分词和文件名扩展的影响。

由于您没有引用变量,因此它在 shell 中显示如下

 ... ¦ sed -n '/VGA/,/^$/ 'p

arg1 =   -n
arg2 =  '/VGA/,/^$/
arg3  = 'p

请参阅 2 和 3 对 sed 来说没有意义,并且它正在抱怨这一点。它认为'是一些 sed 命令。

相关内容