繁体   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