Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 执行正则表达式捕获,然后使用SED/PERL替换_Regex_Perl_Sed - Fatal编程技术网

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选项。 对于eg

perl -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