删除两个参数之间的数据,不包括PERL中的参数

时间:2017-09-13 12:28:36

标签: regex perl awk scripting gawk

我想删除两个参数之间的所有数据; 除了第一次出现

的参数

目前正在删除包括参数。

cat input.txt

) delete; 
Test 
Test
)delete;

perl -0777 -pe 's/\Q)\E.*?\Q;\E//' input.txt

当前输出:

Test 
Test
)delete;

预期产出:

) ; 
Test 
Test
)delete;

如何排除参数? 有什么帮助吗?

对awk中的任何新解决方案表示赞赏。

4 个答案:

答案 0 :(得分:1)

使用GNU awk

$ cat infile
) delete; 
Test 
Test
)delete;

$ awk '!f{print f=gensub(/(\)).*(;)/,"\\1 \\2","a");next}1' infile
) ; 
Test 
Test
)delete;

答案 1 :(得分:0)

如果你想只删除第一次出现的字符串)和; (通过查看您的预期输出),以下可能会帮助您。

awk '!n{n=sub(/^\).*\;/,") ;")} 1'   Input_file

输出如下。

) ;
Test
Test
)delete;

说明:因此,如果名为n' s值的变量为NULL,则在此处检查,在为).*;进行单个替换之前,它将为null。所以一旦它通过了这个条件,就会使用awk的sub关键字替换from)到;使用);并保存它的响应,现在为1替换已经为1,所以下次这个条件(!n)将永远不会为真,因此它将替换第一次出现的{{仅限1}}。 1表示它将打印Input_file的行。

答案 2 :(得分:0)

只需指定用作替代品的内容:

perl -0777 -pe 's/\Q)\E.*?\Q;\E/);/' 

's/\).*?;/);/'可能更具可读性。

您也可以使用环视:

's/(?<=\)).*?(?=;)//'

即。前面有),后跟;,但它们不属于匹配的子字符串。

答案 3 :(得分:0)

awk '{sub(/. delete./,") ;")}1' file

) ; 
Test 
Test
)delete;