我需要使用awk在唯一字符串后的行中将版本号增加一个。
原件:
<key>UniqueKey</key>
<string>100</string>
期望的输出
<key>UniqueKey</key>
<string>101</string>
不幸的是“string”在文件中不是唯一的,所以我必须在唯一的“key”字符串之后修改该行。无论它是什么,我都需要取数字,并将其增加一个。该命令将在每次都被删除的虚拟工作空间中运行,因此首选一个简单的awk命令。
答案 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>
或者如果它真的必须是下一个节点,那么你需要使用concat
和substring
来玩,因为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>