问题描述
我正在尝试读取此配置文件:
#[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"
您可能会认为这是很多引号,但这很可能是您的问题。
- shellcheck.net在这些情况下会很有帮助。