9

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

3 回答 3

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

于 2013-07-31T02:39:06.873 回答
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 文件本身内执行替换。

于 2013-07-31T06:12:57.637 回答
1

你要了一个 Sed 单线,你明白了。

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

于 2013-07-31T02:41:37.607 回答