【问题标题】:to grep a pattern from file compare contents with another file and replace从文件中 grep 模式将内容与另一个文件进行比较并替换
【发布时间】:2013-04-23 14:23:40
【问题描述】:

我想在一个文件中 grep 版本号并在另一个文件中替换它。我想在文件 1 中 grep 4.3.0.5 并在文件 2 中的 4.3.0.2 替换它。我有以下命令来获取数字,但是如何在第二个文件中剪切/替换它??

文件 1:
应用程序:4.3.0.5(或)应用程序:4.3.0.5-SNAPSHOT

文件2: 编辑前

grid_application_distribution_url=nexus://com.abcd.efge.ce/App/4.3.0.2/tar.gz/config

文件 2编辑后(所需结果:

如果文件中的 $VERISON 没有 SNAPSHOT 一词,则在文件 2 中

grid_application_distribution_url=nexus://com.abcd.efge.ce/App/4.3.0.5/tar.gz/config

如果 $VERSION 有 SNAPSHOT 那么文件 2 中的行应该是

grid_application_distribution_url=nexus-snapshot://com.abcd.efge.ce/App/4.3.0.5/tar.gz/config

   VER=$(awk -F: '/^App/{sub(/ .*$/, "", $2); print $2}'/path/file1.txt)

echo $VER

if ($vER ~ /SNAPSHOT/)
/usr/bin/ssh -t -t server2.com "sub("=nexus:", ":=nexus-snapshot") /path/file2" && sub(/[^\/]+\/tar\.gz/, $VER"/tar.gz") /path/file2

【问题讨论】:

  • 任何时候你发现自己在使用 grep+awk 或 grep+sed 或 sed+awk 时使用的工具太多了 - 只需使用 awk。
  • 同上,除了 s/awk/perl/g

标签: unix sed awk grep


【解决方案1】:

你只需要这样的东西:

awk -F': +' 'NR==FNR{v=$2;next} {sub(/[^/]+\/tar.gz/,v"/tar.gz")} 1' File1 File2 > tmp && mv tmp File2

【讨论】:

    【解决方案2】:

    这个 awk 脚本可以完成这项工作(这是对@EDMorton 上述答案的增强):

    根据 OP 的要求将命令拆分为 2

    VER=$(awk -F' *: *' '/^App/{print $2}' file1)
    
    awk -v v="$VER" '{
         split(v, arr, "-");
         sub(/[^\/]+\/tar\.gz/, arr[1]"/tar.gz");
         if (arr[2] ~ /SNAPSHOT/)
            sub("=nexus:", ":=nexus-snapshot")
    }1' file2 > tmpFile
    
    mv tmpFile > file2
    

    【讨论】:

    • 我需要对相同的代码进行一些调整。我已经更新了我原来的帖子。能否请您告诉我解决方案。
    • @sravs448:所以ver文件可以有这个内容:App: 4.3.0.5-SNAPSHOTApp: 4.3.0.5对吗?
    • @sravs448:现在检查答案。
    • 上述代码可以相应地替换 nexus 或 nexus-snapshot。但在 /.tar.gz 之前,我只需要版本号而不需要快照一词,在任何一种情况下(如果 file1 有或没有 SNAPSHOT)
    • 上面代码给我的当前输出是grid_application_distribution_url=nexus-snapshot://com.abcd.efge.ce/App/4.3.0.5-SNAPSHOT/tar.gz/config如果file1里面有SNAPSHOT...但是我在找grid_application_distribution_url=nexus-snapshot://com.abcd.efge.ce/App/4.3.0.5/tar.gz/config
    【解决方案3】:

    你可以试试这个:

    VERSION=($(grep -r "App:" /path/File1| awk  '{print ($2)}'))
    sed -i "s/4.3.0.2/$VERSION/" File2
    

    它将查找“4.3.0.2”并根据$VERSION 中的值进行更改。 File2 将根据此更改进行更新。

    如果您希望文件保持不变,请删除标志-i

    sed "s/4.3.0.2/$VERSION/" File2
    

    你会在标准输出中得到结果。


    如 cmets 所示,4.3.0.2 并非每次都这样。适应格式X.Y.Z.W:

    sed "s/\/[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]\(\/tar.gz\)/\/$VERSION\1/" File2
    

    【讨论】:

    • 每次都不会是4.3.0.2...所以我想多次重用这个命令...我想将“/tar.gz”之前的字符串替换为版本号
    • 我可以使用这样的东西吗? grep -r "App:" /path/File1| awk '{print ($2)}' |cut -f7- -d"/"|sed 's/.\{1\}$//'
    • 有了这个你会得到:4.3.0
    • 那么我应该用什么命令来替换整个版本字符串?
    • 记住要转义句点,即 \. 而不仅仅是 . 这是一个匹配任何字符的 RE 元字符。也不清楚输入数字是否始终为单个数字,因此您可能希望使用 [0-9][0-9]* (适用于所有 sed)。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多