【问题标题】:sed doesn't accept my variable to parse a filesed 不接受我的变量来解析文件
【发布时间】:2021-01-18 11:24:57
【问题描述】:

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

#[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 更改为另一个东西,它就不再起作用了,我认为这是特殊字符,所以我删除了 #[] 但它确实注意到有人可以帮助我,我在理解正则表达式方面很糟糕我的阅读障碍的东西(我也很难通过大量的文档,这就是我问那种东西的原因)。 提前致谢。

【问题讨论】:

  • “我将 val1 和 val2 更改为另一件事”——还有什么?这些变量的新值是什么?

标签: linux bash parsing config seq


【解决方案1】:

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

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

所以为了让它工作,你需要在[之前放两个 \,留下:

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

如果模式中有其他特殊字符,可能需要调整。我只是将您的评论中的模式移到另一个答案中,尽管如果您将真实的模式放在您的问题中会更好,这样可以回答。

【讨论】:

  • 您好,很抱歉 7 天后回答,但我尝试了您的解决方案,但没有奏效。我将 pattern1 和 pattern2 的硬引号 ' 更改为 " 并且它起作用了。
  • 糟糕,抱歉。但无论如何,您似乎已经找到了解决方案。我会修复答案。
【解决方案2】:

尝试像这样在sed 中引用:

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

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

【讨论】:

  • 它似乎不起作用,我尝试在文件和变量中使用和不使用:val1="[TABLE]" val2="[END_TABLE]" sed -n '/^'"$ val1"'/,/^'"$val2"'/p;/^'"$val2"'/q' "$file" 我给我不输出
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 2021-05-26
  • 2015-02-22
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多