sed用文字表达式替换一些模式

时间:2016-02-24 17:08:07

标签: regex awk sed

我有以下sed命令:

sed -i 's#^.*BRANCH_NAME=.*$#\tBRANCH_NAME=$(egrep \\"${project}\\" localFile.xml | sed -n 's_.*changeset=\"\([^\"]\+\).*_\1_p')#' myCfgFile.cfg

基本上我正在尝试用 myCfgFile.cfg 中的 BRANCH_NAME = 替换一行代码:BRANCH_NAME=$(egrep \\"${project}\\" localFile.xml | sed -n 's_.*changeset=\"\([^\"]\+\).*_\1_p')

坏消息是我不能保留BRANCH_NAME=$(egrep \\"${project}\\" localFile.xml | sed -n 's_.*changeset=\"\([^\"]\+\).*_\1_p')字面上的内容,因为我对其进行了解释。

那么,有没有什么方法可以让内容保持原样,而不是由sed解释?正如我上面所说,我正在尝试用其他内容替换一行( BRANCH_NAME = )( * BRANCH_NAME = $(egrep \“$ {project} \“localFile.xml | sed -n的_。 changeset = \”([^ \“] +)。 _ \ 1_p')*

我真的很感谢你的帮助。 感谢

修改

其实我正在处理3个文件:

  1. 一个项目路径列表(下面是格式)

    • /家庭/ MYDIR / proj1

    • /家庭/ MYDIR / proj1 /扩展

    • (...)

  2. 包含项目名称及其相应变更集的.xml文件

  3. <project name="/home/myDir/proj1/extended" path="/home/myDir/proj1/extended" changeset="3c57f20f89de07e1490aac56d1e8aba5848150b5" />
    

    通过执行 for 循环,我得到以下信息:

    for project in (cat projectlis); do
       egrep \\"${project}\\" localFile.xml | sed -n 's_.*changeset=\"\([^\"]\+\).*_\1_p')#' myCfgFile.cfg
    done
    
    1. 我不允许更改和提交的bash脚本:) 此脚本确实包含定义变量的错误行
    2.   

      BRANCH_NAME = *

      在执行我不允许提交的脚本之前,我想更改(从Jenkins内联脚本)错误的行

        

      BRANCH_NAME = *

      BRANCH_NAME=$(egrep \\"${project}\\" localFile.xml | sed -n 's_.*changeset=\"\([^\"]\+\).*_\1_p')`
      

      我希望这更清楚一点。

      由于

1 个答案:

答案 0 :(得分:2)

没有样本输入和预期输出,这是一个很大的猜测,但它看起来像你正在尝试做的只是这与awk:

awk -v project="$project" '
NR==FNR {
    if ($0 ~ project) {
        gsub(/.*changeset="|".*/,"")
        branchName = $0
    }
    next
}
/BRANCH_NAME/ { $0 = "\tBRANCH_NAME=" branchName }
{ print }
' localFile.xml myCfgFile.cfg > tmp && mv tmp myCfgFile.cfg

一旦我们看到你的输入文件,它可能比那更简单。

我仍然无法从你的问题中找出你的输入文件真正包含的内容或者你真正希望你的脚本输出的内容但是这可能会告诉你如何根据你告诉我们的内容做你想做的事情远:

$ cat projectlis   
/home/myDir/proj1
/home/myDir/proj1/extended

$ cat localFile.xml                                    
<project name="/home/myDir/proj1/extended" path="/home/myDir/proj1/extended" changeset="3c57f20f89de07e1490aac56d1e8aba5848150b5" />
<project name="/home/myDir/proj1" path="/home/myDir/proj1" changeset="something-made-up" />

$ cat myCfgFile.cfg                                     
BRANCH_NAME=*

$ cat tst.awk                                           
FILENAME==ARGV[1] {
    proj2branch[$0]
    next
}
FILENAME==ARGV[2] {
    for (proj in proj2branch) {
        if ( index($0,"name=\"" proj "\"") ) {
            gsub(/.*changeset="|".*/,"")
            proj2branch[proj] = $0
        }
    }
    next
}
/BRANCH_NAME/ {
    for (proj in proj2branch) {
        print proj":", "BRANCH_NAME=" proj2branch[proj]
    }
}

$ awk -f tst.awk projectlis localFile.xml myCfgFile.cfg                                                                                
/home/myDir/proj1/extended: BRANCH_NAME=3c57f20f89de07e1490aac56d1e8aba5848150b5
/home/myDir/proj1: BRANCH_NAME=something-made-up