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

Delete data between two parameters excluding the parameters in PERL

我想删除两个参数 ) 和 ; 之间的任何数据,不包括 第一次出现的参数

目前正在删除包括参数。

猫input.txt

) delete; 
Test 
Test
)delete;

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

当前输出:

Test 
Test
)delete;

预期输出:

) ; 
Test 
Test
)delete;

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

也感谢 awk 中的任何新解决方案。

如果您只想删除 ) 和 ; 之间第一次出现的字符串(通过查看您的预期输出)然后以下内容可能会对您有所帮助。

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

输出如下。

) ;
Test
Test
)delete;

解释: 所以在这里检查变量 n 的值是否为 NULL,在对 ).*; 进行单个替换之前它将为 null。因此,一旦它通过该条件,它就会使用 awk 的 sub 关键字来替换从 ) 到 ; 的所有内容。使用 ); 并保存它的响应,现在将是 1,因为已经进行了 1 次替换,所以下次这个条件 (!n) 永远不会为真,因此它只会替换第一次出现的 ).*; . 1 表示它将打印 Input_file.

的行

只需指定要使用的替代品:

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

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

您还可以使用环视:

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

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

使用 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;