【发布时间】:2016-02-25 03:30:38
【问题描述】:
我有以下 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 's_.changeset=\"([^\"]+)._\1_p')*)
非常感谢您的帮助。 谢谢
编辑
实际上我正在处理 3 个文件:
-
一个项目路径列表(以下是格式)
/home/myDir/proj1
/home/myDir/proj1/extended
(...)
包含项目名称及其相应变更集的 .xml 文件
<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
- 我不允许更改和提交的 bash 脚本 :) 此脚本确实包含定义变量的错误行
BRANCH_NAME=*
在执行我不允许提交的脚本之前,我想(从 Jenkins 内联脚本)更改错误的行
BRANCH_NAME=*
与
BRANCH_NAME=$(egrep \\"${project}\\" localFile.xml | sed -n 's_.*changeset=\"\([^\"]\+\).*_\1_p')`
我希望这更清楚一点。
谢谢
【问题讨论】:
-
你不觉得这个命令有点复杂吗?您可以转义所有 sed 元字符,请参阅stackoverflow.com/questions/29613304/…,但如果您编辑问题以包含一些示例输入和预期输出并用
awk标记您的问题,我相信有人可以向您展示一个简洁、简单的脚本来做无论你想做什么,都不要通过古怪的转义、管道命令链、子shell等跳过所有的障碍。 -
您的编辑有点帮助,但现在还是有点模糊。您在第 1 项中描述的文件是您在第 2 项中引用的“projectlis”文件吗?您的 bash 文件是否仅包含其中包含 BRANCH_NAME 的一行? BRANCH_NAME 总是在行首吗?您的 XML 文件是否仅包含 1 行,或者您希望更改其中的多个项目?我无法想象
from Jenkins inline script是什么意思。请编辑您的问题以包含一组清晰的简洁但真正具有代表性的输入文件以及您希望在给定这些输入文件的情况下获得的输出。