使用正则表达式模式使用sed / awk从文件中删除多行

时间:2013-03-07 18:14:04

标签: regex sed awk

Eclipse的“从表中生成实体...”JPA代码生成器坚持创建@Id字段和相关的getter / setter方法,尽管这些是在我在向导步骤中指定的超类中定义的。

要解决这个问题,我的想法是编写一个脚本来删除有问题的行并以其他方式清理生成的文件。 (是的,我可以使用Eclipse中的“查找/替换”对话框手动执行此操作,但我希望自动执行整组更改,因为在处理各种模型时,我将多次执行此代码生成/清理例程。)< / p>

问题是我找不到合适的正则表达式模式来匹配多行以用于awk或sed。我创建的正则表达式模式在Eclipse和TextWrangler的搜索对话框中有效,但不适用于awk或sed。

以下是我要删除的多行文字(当然,单独调用awk / sed):

    @Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false)
private String id;

    public String getId() {
    return this.id;
}

public void setId(String id) {
    this.id = id;
}

请注意,上面引用的代码中的每个非空行都以\ t字符开头,即使粘贴在此处时它不存在。

例如,要删除getter / setter行,我试过

awk '!/\tpublic String getId\(\) \{\r\t\treturn this\.id;\r\t\}\r\r\tpublic void setId\(String id\) \{\r\t\tthis\.id = id;\r\t\}\r/' $file > temp.txt && mv temp.txt $file

或缩短版

awk '!/^\tpublic String getId.*\r.*\r.*\r\r.*\r.*\r.*\r\r/' ... 

但都不起作用。

(两种模式都可以在Eclipse或TextWrangler中找到要删除的行。)

我只能获得单行删除,例如

awk '!/^\tpublic String getId.*\r/' ...

但这没有用,因为删除“\ t \ t \ t”会删除所有方法结尾和类结尾的花括号。

我在运行OS X 10.8.2的Mac上执行此操作,如果这有任何区别的话。

感谢。

1 个答案:

答案 0 :(得分:3)

默认情况下,awk和sed是基于行的工具,因此您无法匹配多行。

我建议使用第一行的正则表达式和最后一行的偏移来识别范围,如下所示:

sed -e '/^\tpublic String getId/,+2 d'

这会删除行public String getId以及以下两行。