使用sed删除代码模式?

时间:2012-02-13 10:24:17

标签: sed

我想使用sed删除以模式开头并以分号(;)结尾的部分代码(段落)。

现在我遇到了一个删除由新行分隔的段落

的示例
sed -e '/./{H;$!d;}' -e 'x;/Pattern/!d' 

我很困惑如何使用分号而不是分隔符而是作为模式。 感谢。

2 个答案:

答案 0 :(得分:2)

其他选项是使用地址范围的GNU扩展名。

下一个示例意味着:从以 pattern 开头的行中删除所有内容,直到以分号结尾的行。

sed '/pattern/,/;$/ d' infile

编辑评论Harsh

尝试下一个sed命令:

sed '/^\s*LOG\s*(.*;\s*$/ d ; /^\s*LOG/,/;\s*$/ d' infile

说明:

/^\s*LOG\s*(.*;\s*$/ d            # Delete line if begins with 'LOG' and ends with semicolon.
/^\s*LOG/,/;\s*$/ d               # Delete range of lines between one that begins with LOG and 
                                  # other that ends with semicolon.

答案 1 :(得分:1)

这可能对您有用:

cat <<! >file
> a
> b
> ;
> x
> y
> ;
> !
sed '/^[^;]*$/{H;$!d};x;s/;//;/x/!d' file  

x
y

说明:

  • 对于任何一行,;
  • 中没有一个/^[^;]*$/
  • 将上面的行附加到保留空间(HS)并删除模式空间(PS)并开始下一次迭代,除非它是文件中的最后一行。 {H;$!d}
  • 如果某行为空/^$/或该文件的最后一行:
    • 切换到HS x
    • 删除第一个; s/;//
    • 搜索模式(x),如果未找到,请删除PS /x/!d

N.B。这会找到任何模式/x/来查找开头模式使用/^x/

编辑:

在看过您的数据和预期结果后,这可能对您有用:

sed '/^\s*LOG(.*);/d;/^\s*LOG(/,/);/d' file