我的文件中有以下行
<field name="cd_version" type="string" size="16" id="-1" sequence="1" defaultValue="14.8.21.1"/>
我试图获取并更新版本号14.8.21.1
即
bash-3.2$ grep cd_version market_rules_cd.reader.xml | awk -F '"' '{print $12}'
14.8.21.1
脚本正在尝试回显当前版本并将其替换为用户输入
# Finds the version number in the file and changes it
#!/bin/bash
# 2014
#
# Usage: ./versionupdate <file>
#
# Arguments:
# 1. File name to have the version number replaced
#
# Finds the version number in the file and changes it
# to the one specified at the prompt.
FNAME=$1
echo $OLD_NO
#Get the version of the
OLD_NO=$(grep "_version=" | awk -F '"' '{print $12}' $FNAME)
echo "What do you want to update release number to?"
REPLACEMENT="_version="$NEW_NO
echo $REPLACEMENT
sed -i ''s/$OLD_NO/$REPLACEMENT/g'' $FNAME
〜 〜
似乎挂在这里
OLD_NO=$(grep "_version=" | awk -F '"' '{print $12}' $FNAME)
答案 0 :(得分:0)
提取版本号的一种更安全的方法是解释字段标记本身,而不是简单地用引号分割。
$ sed -nr 'H;${;x;s/.*<field[^>]+name="cd_version"[^>]+defaultValue="([0-9.]+)"[^>]*\/>.*/\1/;p;}' input.txt
14.8.21.1
您可以使用您已熟悉的符号将版本放入变量中:
$ v=$(sed -nr 'H;${;x;s/.*<field[^>]+name="cd_version"[^>]+defaultValue="([0-9.]+)"[^>]*\/>.*/\1/;p;}' input.txt)
$ echo $v
14.8.21.1
这个sed脚本可能有一些解释......
H;
- 将“当前”行追加到sed的“暂停空间”${;
- 一旦我们点击最后一行,请执行以下操作...
x;
- 更改模式空间的保留空间(以便我们可以对其进行处理),s/.*<field...([0-9.]+)...\/>.*/\1/;
- 从正确的字段中提取defaultValue
p;}
- 并打印结果。对于多行<field>
出现在一行上的情况(只要只有一个cd_version),或者<field>
的属性分为多行,这应该是安全的。
请注意,这是一个黑客,你可能应该使用实际正确解释这样的字段的工具。人们普遍认为you cannot parse HTML with regex,同样的推理适用于其他SGML。
一旦您获得版本号,您就可以使用sed -i
来替换它。
$ newver="foobar"
$ grep -o 'defaultValue="[^"]*"' input.txt
defaultValue="14.8.21.1"
$ sed -i '' 's/defaultValue="14.8.21.1"/defaultValue="'"${newver}"'"/' input.txt
$ grep -o 'defaultValue="[^"]*"' input.txt
defaultValue="foobar"
请注意,我使用的是FreeBSD,其sed
的行为可能与您使用的操作系统中的行为不同。即使这样可行,您也应该阅读这里使用的每个工具和选项的文档,以确保您理解为什么它正在做它正在做的事情。特别是,我使用的替换正则表达式缩短了以便于阅读。为了安全起见,您应该像在找到版本号的初始sed脚本中展开它一样展开它,这样除了{之外的其他字段不会更改defaultValue
{1}}。