簡體   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