[英]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.