【问题标题】:Bash replace string with another in determined patternBash以确定的模式用另一个替换字符串
【发布时间】:2021-07-14 20:08:53
【问题描述】:

我有一个包含此字符串requires="ua-common/2.7.25@aep/stable"(版本号可变)的文件,我需要将其替换为requires="ua-common/2.7.26@aep/stable"(版本号可变)。所以我需要在不知道它的值是什么的情况下更改版本号。 我需要像这样制作一个小脚本:

#!/bin/bash

echo "Insert version number: "
read version
#replace $version with old version in file

谢谢

【问题讨论】:

  • 那么requires="ua-common/${version}@aep/stable" 是您的脚本中的什么内容?
  • 请确认您是否总是有相同格式的字符串requires="ua-common/2.7.25@aep/stable"?或者它也可以是一些不同的格式?
  • 格式始终为 requires="ua-common/unknown@aep-stable"
  • @Fausto01 如果没有更明确的说明,这就是你的答案:newRequires="ua-common/$version@aep/stable"

标签: linux bash shell


【解决方案1】:

我是这样理解你的问题的。

文件file.txt

fjlakjflajkflkajfjakjfalkjfoairujnasncv
O
aljflajflja ljfaljflakjflakjf
ia;jflajfjaljfajflajfoiuqoruaf
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
requires="ua-common/2.7.25@aep-stable"
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
jalfjalkfjaoeiurjasnvafnaojf
jvjvg]
iajfiaufurva ajfaj

脚本myscript

#!/usr/bin/env bash

current_version=$(grep -oP 'requires="ua-common\/\K.*?(?=@)' file.txt)

printf 'The current version is: %s\n\n' "$current_version"

read -rp "Insert a new version number: " version

if [[ -n $version ]]; then
  sed "s|\(requires=.*ua-common/\).*\(@.*\)\$|\1$version\2|" file.txt
fi

然后运行

bash ./myscript

输出

The current version is: 2.7.25

Insert a new version number: 

输入新版本号:

The current version is: 2.7.25

Insert a new version number: 2.7.26

输出

fjlakjflajkflkajfjakjfalkjfoairujnasncv
O
aljflajflja ljfaljflakjflakjf
ia;jflajfjaljfajflajfoiuqoruaf
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
requires="ua-common/2.7.26@aep-stable"
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
jalfjalkfjaoeiurjasnvafnaojf
jvjvg]
iajfiaufurva ajfaj

还有一些与当前脚本有关的事情,例如错误检查、出错时退出等等,但这是一个开始。

【讨论】:

    【解决方案2】:

    第一个解决方案:使用您显示的示例(这适用于以示例格式显示的任何版本),请尝试遵循awk 代码。这将输出为ua-common/2.7.26@aep/stable 并显示示例。

    echo "$requires" | 
    awk '
      match($0,/([0-9]+\.)*[0-9]+/){
        value=substr($0,RSTART,RLENGTH)
        num=split(value,arr,".")
        arr[num]+=1
        value=""
        for(i=1;i<=num;i++){
          value=(value?value ".":"")arr[i]
        }
        print substr($0,1,RSTART-1) value substr($0,RSTART+RLENGTH)
    }
    '
    


    第二个解决方案:如果您的输入始终相同,并且您想在 @ 之前增加数字,请尝试以下操作。

    echo "$requires" | 
    awk '
      match($0,/[0-9]+@/){
        print substr($0,1,RSTART-1) substr($0,RSTART+1,RLENGTH-1)+1 substr($0,RSTART+RLENGTH-1)
    }
    '
    

    【讨论】:

      【解决方案3】:

      自从您要求 bash 以来最明显的解决方案(不适用于主要链接到 /bin/sh 的 dash)

      #!/bin/bash
      oldVersion=2.7.25
      newVersion=2.7.26
      requires="ua-common/2.7.25@aep/stable"
      echo "${requires//$oldVersion/$newVersion}"
      

      和输出:

      ua-common/2.7.26@aep/stable
      

      参考页面:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

      【讨论】:

      • 如果我不知道旧版本?
      • @Fausto01 那么你的问题没有被明确提出。甚至newRequires="ua-common/$newVersion@aep/stable" 似乎也是一个有效的答案。还是要增加现有版本?
      【解决方案4】:

      您可能希望将 sed 用于该工作。根据您需要调整 sed 搜索模式的文件内容:

      #: cat test.file
      requires="ua-common/2.7.25@aep/stable"
      #: sed -i 's/^requires=\"ua-common\/[0-9]*.[0-9]*.[0-9]*.@/requires=\"ua-common\/1.2.3@/g' test.file
      #: cat test.file
      requires="ua-common/1.2.3@aep/stable"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-28
        • 2013-12-03
        • 2011-08-21
        • 2019-05-14
        • 2015-01-03
        • 2016-11-24
        • 2021-01-05
        • 2021-06-20
        相关资源
        最近更新 更多