我想删除两个参数之间的所有数据; 除了第一次出现
的参数目前正在删除包括参数。
cat input.txt
) delete;
Test
Test
)delete;
perl -0777 -pe 's/\Q)\E.*?\Q;\E//' input.txt
当前输出:
Test
Test
)delete;
预期产出:
) ;
Test
Test
)delete;
如何排除参数? 有什么帮助吗?
对awk中的任何新解决方案表示赞赏。
答案 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;