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

时间:2013-07-31 02:25:35

标签: regex perl sed

我有一个看起来像这样的数据(让我们称这个文件为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/$/ >/'

3 个答案:

答案 0 :(得分:15)

您可以使用转义括号来捕获群组,并使用\ 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 edit file in place

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

执行相同操作的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文件中执行替换。