sed不接受我的变量来解析文件

问题描述

我正在尝试读取此配置文件

#[TABLE]
pattern1
disK_MAIN
PART_EFI
PART_SWAP
PART_ROOT
pattern2
#[END_TABLE]
... rest of the file

我认为我必须使用sed,但是我研究了如何做,并看到了这个示例:

val1="pattern1"
val2="pattern2"
sed -n "/^$val1/,/^$val2/p;/^$val2/q" $file

但是一旦我将val1和val2更改为另一种东西就不再起作用了,我以为是特殊字符,所以我删除了#[],但是它没有注意到有人可以帮助我,我对理解正则表达式很不好与阅读障碍有关的东西(这对我来说也很难遍历繁重的文档,这就是为什么我要这种东西的原因)。 预先感谢。

解决方法

您正确的说,模式中的[会影响匹配,因为它是一个正则表达式元字符。 (#没问题,]仅在[之后是特殊的。)但是您不能仅仅删除它们,因为您的模式以^开头,这意味着必须与行首匹配,并且行首恰好是#,后跟[

因此,您需要告诉sed忽略[的含义,您可以通过在其前面放置一个\来实现。但是,您不能仅在命令中添加\,因为\是shell的特殊字符(意味着下一个字符没有特殊的意义,就像在sed中一样)。

因此,为了使其正常工作,您需要在\前面加上两个 [,让您:

pattern1='#\\[TABLE]'
pattern2='#\\[END_TABLE]'
sed -n "/^$pattern1/,/^$pattern2/p;/$pattern2/q;" "$file"

如果图案中还有其他特殊字符,则可能需要进行调整。我只是将您评论中的模式带到不同的答案,尽管如果您将真实的模式放在问题中会更好地回答,这会更好。

,

尝试像这样在sed中引用:

sed -n '/^'"$val1"'/,/^'"$val2"'/p;/^'"$val2"'/q' "$file"

您可能会认为这是很多引号,但这很可能是您的问题。