使用awk将下一行中的版本号增加1

时间:2018-05-24 23:52:39

标签: awk

我需要使用awk在唯一字符串后的行中将版本号增加一个。

原件:

<key>UniqueKey</key>
<string>100</string>

期望的输出

<key>UniqueKey</key>
<string>101</string>

不幸的是“string”在文件中不是唯一的,所以我必须在唯一的“key”字符串之后修改该行。无论它是什么,我都需要取数字,并将其增加一个。该命令将在每次都被删除的虚拟工作空间中运行,因此首选一个简单的awk命令。

2 个答案:

答案 0 :(得分:0)

这看起来非常像XML文件。强烈建议对此作业使用与XML相关的工具,例如xmlstarlet

假设给定的输入文件格式为:

<header>
  <node>
    <key>UniqueKey</key>
    <foo />
    <string>100</string>
  </node>
  <node>
    <key>UniqueKey</key>
    <string>101</string>
    <string>200</string>
  </node>
</header>

然后以下命令将按要求更新:

$ xmlstarlet ed -u '//key[text()="UniqueKey"]/following-sibling::string[1]' \
                -x '(text()+1)' file.xml

执行以下操作:

  • ed:进入编辑模式
  • -u <xpath>:更新xpath

    匹配的节点
    • //key:选择名称为key
    • 的任何节点
    • //key[text()="UniqueKey"]:选择名称为key且值为"UniqueKey"
    • 的任何节点
    • //key[text()="UniqueKey"]/following-sibling::string:选择key后面的key的第一个'字符串'兄弟姐妹
  • -x '(text()+1)':按表达式text()+1

  • 更新所选节点的值

输出由:

给出
<?xml version="1.0"?>
<header>
  <node>
    <key>UniqueKey</key>
    <foo/>
    <string>101</string>   # change
  </node>
  <node>
    <key>UniqueKey</key>
    <string>102</string>   # change
    <string>200</string>   # no change
  </node>
</header>

或者如果它真的必须是下一个节点,那么你需要使用concatsubstring来玩,因为xpath-1.0没有if条件。更多详情here

$ xmlstarlet ed -u '//key[text()="UniqueKey"]/following-sibling::*[1]' \
                -x 'substring(text()+1,1,number(name()="string")*string-length(text()+1))' file.xml

<?xml version="1.0"?>
<header>
  <node>
    <key>UniqueKey</key>
    <foo/>
    <string>100</string>   # no change
  </node>
  <node>
    <key>UniqueKey</key>
    <string>102</string>   # change
    <string>200</string>   # no change
  </node>
</header>

答案 1 :(得分:0)

$ awk -F'[<>]' '$2=="string" && p3=="UniqueKey" { sub(/>[^<]+/,">"$3+1) } {p3=$3} 1' file
<key>UniqueKey</key>
<string>101</string>