【问题标题】:perl or sed command to find 2 strings and replace the first string with string 2perl 或 sed 命令查找 2 个字符串并将第一个字符串替换为字符串 2
【发布时间】:2019-07-13 04:34:24
【问题描述】:

我有多个带有以下文本的文件。

文件 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 -pe '/^"\s+(\d+)/"=$1 "/s+\""=$2"' 文件..
  • 我是 perl 的初学者

标签: regex shell perl sed


【解决方案1】:

试试这个:

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

这将首先捕获“orig”文件名(假设它们都有“.txt”扩展名),然后替换“tmp”占位符。

【讨论】:

    【解决方案2】:

    在任何 UNIX 机器上的任何 shell 中使用任何 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\"");
    

    【讨论】:

      【解决方案3】:

      通过 gnu sed 作为您在 'd' 中的数据,

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

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 2021-03-16
        • 1970-01-01
        • 2011-12-21
        • 2020-01-12
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多