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

在下一行中使用awk将版本号增加1,awk,Awk,我需要使用awk在一个唯一字符串后的行中将版本号增加1 原件: <key>UniqueKey</key> <string>100</string> UniqueKey 100 期望输出 <key>UniqueKey</key> <string>101</string> UniqueKey 101 不幸的是,“字符串”在文件中不是唯一的,所以我必须修改唯一的“key”字符串后面的行。我需要把这个

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

原件:

<key>UniqueKey</key>
<string>100</string>
UniqueKey
100
期望输出

<key>UniqueKey</key>
<string>101</string>
UniqueKey
101
不幸的是,“字符串”在文件中不是唯一的,所以我必须修改唯一的“key”字符串后面的行。我需要把这个数字,不管它是什么,增加一个。该命令将在每次删除的虚拟工作区中运行,因此最好使用简单的awk命令。

$awk-F'[]'''''$3==“UniqueKey”{n=NR}
$ awk -F'[<>]' '$3=="UniqueKey"{n=NR} 
   n && NR==n+1 && $2=="string"{sub($3,$3+1)}1' file

<key>UniqueKey</key>
<string>101</string>
n&&NR==n+1&&2==“string”{sub($3,$3+1)}1”文件 唯一键 101
$awk-F'[]'$3==“UniqueKey”{n=NR}
n&&NR==n+1&&2==“string”{sub($3,$3+1)}1”文件
唯一键
101

这看起来非常像一个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>
这样做的目的如下:

  • ed
    :进入编辑模式
  • -u
    :更新由
    xpath匹配的节点

    • //键
      :选择名为
    • //key[text()=“UniqueKey”]
      :选择名称为
      key
      且值为
      的任何节点“UniqueKey”
    • //key[text()=“UniqueKey”]/following sibling::string
      :选择
      key
      之后的
      key
      的第一个“string”同级
  • -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>

这看起来非常像一个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>
这样做的目的如下:

  • ed
    :进入编辑模式
  • -u
    :更新由
    xpath匹配的节点

    • //键
      :选择名为
    • //key[text()=“UniqueKey”]
      :选择名称为
      key
      且值为
      的任何节点“UniqueKey”
    • //key[text()=“UniqueKey”]/following sibling::string
      :选择
      key
      之后的
      key
      的第一个“string”同级
  • -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>

$awk-F'[]'''$2==“string”&&p3==“UniqueKey”{sub(/>[^
$awk-F'[]''][''''$2==“string”&&p3==“UniqueKey”{sub(/>[^)虽然这个答案可能是正确和有用的,但最好在回答的同时包含一些解释,以解释它如何帮助解决问题。如果将来有变化,这将变得特别有用(可能无关)这会导致它停止工作,用户需要了解它曾经是如何工作的。你错了。任何人只要简单浏览一下谷歌和/或一个手册页就可以找到的琐碎解决方案最好保持原样,因为人们从中学到的远不止一个脚本是如何工作的。嗨,埃德。显然你比我有更多的因果报应,所以我要反驳r、 我只在代码答案上保留此选项,以鼓励更丰富的答案。对于我们这些有经验的人来说,琐碎的东西对于刚起步的人来说可能并不琐碎:)不要只对你不懂的代码答案发表评论,这会把网站弄得一团糟,浪费人们的时间。当工具看到只懂代码的答案时,它会标记出可能的低质量答案,这是一种有严重缺陷的方法,由懂代码的人来决定答案是否低质量——没有什么根本的问题“仅代码”答案和“仅代码”答案的错误并不意味着质量低。虽然此答案可能是正确和有用的,但如果您在答案中包含一些解释,以解释它如何帮助解决问题,则建议您使用此答案。如果将来发生更改(可能不相关),此选项将特别有用这会导致它停止工作,用户需要了解它曾经是如何工作的。你错了。任何人只要简单浏览一下谷歌和/或一个手册页就可以找到的琐碎解决方案最好保持原样,因为人们从中学到的远不止一个脚本是如何工作的。嗨,埃德。显然你比我有更多的因果报应,所以我要反驳r、 我只在代码答案上保留此选项,以鼓励更丰富的答案。对于我们这些有经验的人来说,琐碎的东西对于刚起步的人来说可能并不琐碎:)不要只对你不懂的代码答案发表评论,这会把网站弄得一团糟,浪费人们的时间。当工具看到只懂代码的答案时,它会标记出可能的低质量答案,这是一种有严重缺陷的方法,由懂代码的人来决定答案是否低质量——没有什么根本的问题仅代码答案和仅代码的错误并不意味着低质量。
$ awk -F'[<>]' '$2=="string" && p3=="UniqueKey" { sub(/>[^<]+/,">"$3+1) } {p3=$3} 1' file
<key>UniqueKey</key>
<string>101</string>