如何仅搜索sed中的第一个模式范围

时间:2017-10-24 17:06:32

标签: sed

我的输入文件看起来像这样

Start1
some text
that I want
modified
Pattern1
some other text
which I do not want
to modify
End1

Start1
Pattern2
End1

我的sed模式看起来像这样

/Start1/,/Pattern1/c\
Start1\
Modification text here\
Pattern1\
additional modifications

我只想修改Start1End1的第一个范围内的文字。 另外,我还指定了Pattern1,它在第二个范围内不存在。

我跑

sed -i -f <sed_file> <input_file>

但是,我的输出如下。由于某种原因,即使Pattern1中不存在Start1 Modification text here Pattern1 additional modifications some other text which I do not want to modify End1 ,它也会清除第二个范围。

Start1
Modification text here
Pattern1
additional modifications
some other text
which I do not want
to modify
End1

Start1
Pattern2
End1

预期结果

someArrayList.remove(integerKeyLocation.intValue());

2 个答案:

答案 0 :(得分:0)

试试这个

sed ':A;/Start1/!b;N;/Pattern1/!bA;s/\(Start1\n\)\(.*\)\(\nPattern1\)/\1Modification text here\3\nadditional modifications/' infile

答案 1 :(得分:0)

在GNU sed中:

  • sed -e '/START/,/END/c TEXT

不同
  • sed -e '/START/,/END/{c TEXT' -e '}'

第一个将开始从输出流中省略范围,并在到达范围的末尾时将TEXT的一个实例发送到输出字符串中。第二行将用TEXT替换范围中的每一行。

您的问题是,即使您从未到达第二个范围的末尾,也会从输出流中省略第二个范围。 /START/,/END/c永远不会出现的/END/基本上就像/START/,$d

我能想到的唯一解决方案是笨重的:

/Start1/,/Pattern1/{
    /Pattern1/{
        # Insert into output stream
        i\
Start1\
Modification text here\
Pattern1\
additional modifications
        # Read in the rest of the file
        :a 
        $!N
        $!ba
        # Remove the original Pattern1 line from the pattern space
        # (Remove first line and newline of pattern space)
        s/^[^\n]*\n//
        # Print pattern space and quit
        q
    }
    # Delete lines in the range other than /Pattern1/
    d
}