我正在尝试在 .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 命令。