簡體   English   中英

perl或sed命令查找2個字符串並將第一個字符串替換為字符串2

[英]perl or sed command to find 2 strings and replace the first string with string 2

我有以下文本的多個文件。

文件1的內容:

Begin("tmp1","derived from file \"/disks/setup/ORIG_FILE1.txt\"");

文件2的內容:

Begin("tmp1","derived from file \"/disks/setup/ORIG_FILE2.txt\"");

文件3的內容:

Begin("tmp9","derived from file \"/disks/setup/ORIG_FILE4.txt\"");

等等.....

在perl或sed中是否有任何命令來查找帶有“ Begin”的行,並在該行中搜索“ ...”(即本例中的“ tmp1”)之間的第一個字符串並將其存儲在變量中,然后搜索/ .. \\“”之間的最后一個字符串,即(此處為ORIG_FILE1.txt),並將其存儲在變量2中,然后從變量2中刪除“ .txt”,然后將變量1替換為變量2並更新文件。

因此輸出文件如下所示:

文件1的內容:

Begin("ORIG_FILE1","derived from file \"/disks/setup/ORIG_FILE1.txt\"");

文件2的內容:

Begin("ORIG_FILE2","derived from file \"/disks/setup/ORIG_FILE2.txt\"");

文件3的內容:

Begin("ORIG_FILE4","derived from file \"/disks/setup/ORIG_FILE4.txt\"");

等等.....

有人可以幫我嗎?

嘗試這個:

perl -i.bak -pe '
    if (/.*\/(.+)\.txt/) {
        $file = $1;
        s/(?<=").*?(?=")/$file/
    }
' file1 file2 file3 ...

這將首先捕獲“ orig”文件名(假設它們都具有“ .txt”擴展名), 然后替換“ tmp”占位符。

在任何UNIX機器上的任何外殼中使用任何sed:

$ sed 's/\([^"]*"\)[^"]*\(.*\/\([^.]*\)\)/\1\3\2/' file
Begin("ORIG_FILE1","derived from file \"/disks/setup/ORIG_FILE1.txt\"");
Begin("ORIG_FILE2","derived from file \"/disks/setup/ORIG_FILE2.txt\"");
Begin("ORIG_FILE4","derived from file \"/disks/setup/ORIG_FILE4.txt\"");

通過gnu sed作為您在“ d”中的數據,

 sed -E 's~^(Begin\(")\w+(".+/)(\w+)(\.\w+\\""\);)~\1\3\2\3\4~' d

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM