繁体   English   中英

执行正则表达式捕获,然后使用SED / PERL替换

[英]Performing regex capture and then substitute using SED/PERL

我有一个看起来像这样的数据(让我们称这个文件为submit.txt ):

dir1/pmid_5409464.txt
dir1/pmid_5788247.txt
dir1/pmid_4971884.txt

我想要做的是执行内联文件正则表达式更改,以便它导致以下结果

perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversaint/dir1/pmid_5409464.output
perl mycode.pl/home/neversaint/dir1/pmid_5788247.txt > /home/neversaint/dir1/pmid_5788247.output
perl mycode.pl /home/neversaint/dir1/pmid_4971884.txt > /home/neversaint/dir1/pmid_4971884.output

是否有一个SED / Perl衬垫来做到这一点?

我的困难在于捕获输入文件名,然后为每一行创建输出文件( .output ) - 基于此。 我坚持这个:

sed 's/^/perl mycode.pl \/home\/neversaint\/dir1\//g' submit.txt |
sed 's/$/ >/'

您可以使用转义括号来捕获组,并使用\\ 1,\\ 2等访问组。

sed 's/^\(.*\).txt$/perl mycode.pl \/home\/neversaint\/\1\.txt > \/home\/neversaint\/\1.output/' submit.sh

输出:

perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversaint/dir1/pmid_5409464.output
perl mycode.pl /home/neversaint/dir1/pmid_5788247.txt > /home/neversaint/dir1/pmid_5788247.output
perl mycode.pl /home/neversaint/dir1/pmid_4971884.txt > /home/neversaint/dir1/pmid_4971884.output

编辑:它看起来不像sed有一个内置的文件编辑(GNU sed有-i选项)。 它仍然可以,但这个解决方案只是打印到标准。 您也可以使用Perl one liner,如下所示: sed编辑文件

你问了一个Sed单行,你得到了它。

sed 's/\\([^.]*\\)\\.txt/perl mycode.pl \\/home\\/neversaint\\/\\1.txt > \\/home\\/neversaint\\/\\1.output/' submit.txt > output.txt

用于执行相同操作的perl oneliner是

perl -pe "s@(.*?)(\.txt)@perl mycode.pl /home/neversaint/\\1\\2 > /home/neversaint/\\1.output@g" submit.txt

上面的命令将在控制台中生成替换的字符串,您必须将输出重定向到另一个文件。

要在文件中替换(内联替换),可以添加-i选项。 例如

perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt

以上将在submit.txt文件中执行替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM