Regex 执行正则表达式捕获,然后使用SED/PERL替换
我有一个类似这样的数据(我们将此文件称为Regex 执行正则表达式捕获,然后使用SED/PERL替换,regex,perl,sed,Regex,Perl,Sed,我有一个类似这样的数据(我们将此文件称为submit.txt): perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt 我想做的是执行一个内联文件regex更改 因此,它会产生以下结果 perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversai
submit.txt
):
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
我想做的是执行一个内联文件regex更改
因此,它会产生以下结果
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
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
是否有一个SED/Perl一行程序可以做到这一点
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
我的困难在于捕获输入文件名,然后
基于此为每行创建输出文件(.output
)。我被这件事困住了:
sed 's/^/perl mycode.pl \/home\/neversaint\/dir1\//g' submit.txt |
sed 's/$/ >/'
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
您可以使用转义括号捕获组,并使用\1、\2等访问组
sed 's/^\(.*\).txt$/perl mycode.pl \/home\/neversaint\/\1\.txt > \/home\/neversaint\/\1.output/' submit.sh
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.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
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
编辑:看起来sed没有内置的文件编辑功能(gnused有-i选项)。仍然可以这样做,但此解决方案仅打印到标准输出。您还可以使用Perl一行程序,如下所示:您要求使用Sed一行程序,您得到了
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
sed的/\([^.]*\)\.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
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
上面的命令将在控制台中生成一个替换的字符串,您必须将输出重定向到另一个文件
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
对于文件内的替换(内联替换),可以添加-i选项。
对于egperl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt
上述内容将在submit.txt文件本身内执行替换。
awk'{print“xxx/x/y/“$0”>xxxxxxxx/$0}'list>output
?祝你好运。不,那不行。重点是每行从pmid\u xxx.txt
中捕获pmid\u xxx
,并打印该pmid\u xxx的输出版本。也为每行输出itor,后来我意识到。不客气!您可以使用shell变量将其拆分,类似于以下内容:。基本上,将搜索字符串存储在一个变量中,并在另一个变量中替换字符串。我不知道这是否会有多大帮助,因为替换字符串仍然很长。您还可以将搜索和替换部分放在一个文件中,并将其称为using sed-f选项当字符串中有许多斜杠(例如文件名)时,请使用另一个分隔符,而不是/。sed还与124;、|或:。
perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt