从文件比较内容与另一个文件grep一个模式并替换

时间:2013-04-23 14:23:40

标签: unix sed awk grep

我想在一个文件中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 = 关系://com.abcd.efge.ce/App/的 4.3.0.2 /tar.gz/config

文件2 编辑后所需结果

如果文件中的$ VERISON没有单词SNAPSHOT,那么在文件2中

grid_application_distribution_url = 关系://com.abcd.efge.ce/App/的 4.3.0.5 /tar.gz/config

如果$ VERSION有SNAPSHOT,那么文件2中的行应为

grid_application_distribution_url = 关系快照://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

3 个答案:

答案 0 :(得分:2)

这就是你需要的东西:

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

答案 1 :(得分:0)

你可以试试这个:

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

您将在stdout中获得结果。


如评论中所示,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

答案 2 :(得分:0)

这个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