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

问题描述:

我想删除两个参数之间的任何数据,不含参数只是第一次出现在两个参数之间删除数据,但不包括PERL中的参数

目前其删除,包括参数。

猫input.txt中

) delete; 
Test 
Test 
)delete; 

 

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

电流输出:

Test 
Test 
)delete; 

预期输出:

) ; 
Test 
Test 
)delete; 

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

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

+0

不应该期望的输出必须在最后删除单词'delete'?因为你说的排除第一次出现 – Inian

+0

提示:'\)'比'\ Q)\ E'清晰得多。如果它仍然不够清楚,请使用'/ x'并将空格添加到您的模式。 – ikegami

只要指定作为替换的内容:

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

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

您还可以使用查找变通:

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

即前面是),其次是;,但它们不属于匹配的子字符串。

+0

感谢它工作正常。 –

+0

's /(? ikegami

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

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

输出将是如下。

) ; 
Test 
Test 
)delete; 

说明:所以这里检查,如果变量名为N的值是NULL,它会为).*;由单一的替代之前为空。所以一旦它通过了这个条件,它就会使用awk的子关键字来代替所有的)。与);并保存它的响应,现在作为1替代已经被做出,因此下一次这个条件(!n)永远不会是真的,因此它将仅替代第一次出现的).*;。 1意味着它将打印Input_file的行。

+0

任何人都可以让我知道投票的理由吗? – RavinderSingh13

+0

现在做了,实际上因为没有使用代码标签,所以不清楚是否需要空间,所以我没有把它放在那里,请让我知道如果你现在就可以移除它。 – RavinderSingh13

使用GNU awk

$ cat infile 
) delete; 
Test 
Test 
)delete; 

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

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

) ; 
Test 
Test 
)delete;