【问题标题】:Shell: Subsitute a string between 2 Known stringsShell:在 2 个已知字符串之间替换一个字符串
【发布时间】:2013-05-03 03:55:59
【问题描述】:

我希望替换 file1 中 abc_def_APP 和 application1.war 字符串之间的 new_version 变量 (13.2.0/8) 的内容

脚本:

    #!/bin/ksh
   new_version="13.0.5/8"          
 old_version=($(grep -r "location=.*application1.war" /path/file1| awk '{print ($1)}'| cut -f8- -d"/"|sed 's/.\{1\}$//'))
   echo "$old_version" 'This gives me version number from file1 which needs to be replaced(13.2.0/9)

文件 1 内容:

location="cc://view/blah/blah/blah/abc_def_APP/13.2.0/9/application1.war"

【问题讨论】:

  • 您如何知道文件内容中旧版本文本的位置?我的意思是13.2.0/9 也可以是不同的字符串,不是吗?
  • 是的,它可以是任何字符串。我需要将abc_def_APPapplication1.war 之间的字符串替换为新版本号
  • 但是脚本如何知道应该在文件内容的哪个位置进行替换?
  • @anubhava:我在上面的评论中更新了我的答案。 .该脚本需要将abc_def_APPapplication1.war之间的字符串替换为新的版本号。并且该行也始终以location=开头
  • @anubhava : 我们可以在application1.war 上做一个正则表达式匹配然后替换吗?

标签: shell replace sed awk


【解决方案1】:

使用以下 sed 命令进行替换:

sed -i.bak -r "s#^(.*/abc_def_APP/).*(/application1\.war.*)#\1$version1/$version2\2#" /path/file1

【讨论】:

    【解决方案2】:

    使用 GNU awk(用于 gensub()):

    $ cat file
    location="cc://view/blah/blah/blah/abc_def_APP/13.2.0/9/application1.war"
    
    $ new_version="13.2.0/8" 
    
    $ gawk -v nv="$new_version" '{$0=gensub(/^(location.*abc_def_APP\/).*(\/application1.war.*)/,"\\1" nv "\\2","")}1' file
    location="cc://view/blah/blah/blah/abc_def_APP/13.2.0/8/application1.war"
    

    此解决方案与 sed 解决方案之间的区别在于,由于 new_version 变量包含“/”(或任何其他字符),因此 awk 不需要您跳过障碍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多