BASH GREP和AWK里面的VARIABLE

时间:2014-09-18 13:36:22

标签: bash unix awk sed

我的文件中有以下行

<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)

1 个答案:

答案 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}}。