【问题标题】:Find text enclosed by patterns using sed使用 sed 查找由模式包围的文本
【发布时间】:2014-04-15 07:10:47
【问题描述】:

我有一个这样的配置文件:

[whatever]
Do I need this? no!

[directive]
This lines I want
Very much text here
So interesting

[otherdirective]
I dont care about this one anymore

现在我想匹配[directive][otherdirective] 之间的行而不匹配[directive][otherdirective]

此外,如果没有找到 [otherdirective],则应返回文件末尾的所有行。 [...] 可能包含任何数字或字母。

尝试

我使用sed 尝试过这样的操作:

sed -r '/\[directive\]/,/\[[[:alnum:]+\]/!d

这种尝试的唯一问题是第一行是[directive],最后一行是[otherdirective]

我知道如何再次通过管道截断第一行和最后一行,但有 sed 解决方案吗?

【问题讨论】:

    标签: regex bash sed sh


    【解决方案1】:

    您可以像尝试一样使用范围,并在其中使用// 否定。当它为空时,它会重用最后匹配的正则表达式,因此它将跳过两条边缘线:

    sed -n '/\[directive\]/,/\[otherdirective\]/ { //! p }' infile
    

    它产生:

    This lines I want
    Very much text here
    So interesting
    

    【讨论】:

    • hmm,唯一的问题是我真的不知道其他指令,这是我使用/\[[[:alnum:]]+\]/-n 标志和这些{ ... } 命令正是我正在寻找的!如果我尝试它不会返回正确的解决方案
    • 好吧 wtf 我又试了一次,你说得对,即使我替换 \[otherdirective\]/ 只是忘了再次添加 -r,它仍然有效! thx 要小得多,//! 是一个方便的技巧!
    【解决方案2】:

    这是使用awk 获取部分数据的好方法。

    awk -v RS= '/\[directive\]/' file
    [directive]
    This lines I want
    Very much text here
    So interesting
    

    当将 RS 设置为空 RS= 时,它会根据空白行将文件划分为记录。
    因此,当搜索[directive] 时,它将打印该记录。
    通常一条记录是一行,但由于 RS(记录选择器)发生变化,它给出了块。

    【讨论】:

    • 您能解释一下为什么会这样吗?我真的一点头绪都没有!甚至认为它不会删除开头的[directive]
    【解决方案3】:

    好吧,经过多次尝试,我找到了解决方案,或者只是一个解决方案:

    sed -rn '/\[buildout\]/,/\[[[:alnum:]]+\]/{
        /\[[[:alnum:]]+\]/d
        p }'
    

    【讨论】:

      【解决方案4】:

      这是你想要的吗?

      \[directive\](.*?)\[
      

      Look here

      【讨论】:

      • 基本上是的。尽管在不打开新指令的情况下可能会出现括号。我仍然应该如何在bash 命令中使用这种模式!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      相关资源
      最近更新 更多