我在Linux中搜索工具(链)(sed / bash / ...)以实现以下目的:通过文本文件(此处:XML)查找相同的值,检查这些值以查找某些规则并更正这些值通过添加偏移值。
一个例子是:
<!--Origin.txt-->
<Tree>
<Node foo="600" bar="50" />
<Node foo="-300" bar="600" />
</Tree>
我现在不想完全忽略吧,但检查是否例如foo小于零。如果是,请将1000添加到foo。如果没有,请保留。
<!--Output.txt-->
<Tree>
<Node foo="600" bar="50" />
<Node foo="700" bar="600" />
</Tree>
我可以写一个小的python / java程序,但我打赌有一个更快的bash / sed / ...脚本来做这个;)
答案 0 :(得分:0)
使用perl
的一种方式:
infile
的内容:
<!--Origin.txt-->
<Tree>
<Node foo="600" bar="50" />
<Node foo="-300" bar="600" />
</Tree>
运行下一个命令:
perl -pe '
s/\A(\s*<(?i:node)\s+(?i:foo)\s*=\s*")([^"]+)(")/$1 . (defined $2 && $2 < 0 ? $2 + 1000 : $2) . $3/e
' infile
结果:
<!--Origin.txt-->
<Tree>
<Node foo="600" bar="50" />
<Node foo="700" bar="600" />
</Tree>
答案 1 :(得分:0)
用vim打开你的文件,然后输入:
:%s/foo="\zs\(-[0-9]\+\)"\ze/\=submatch(1)+1000/g
它应该完成4你的工作。
修改强>
awk oneliner适用于您的新要求。
awk '{for(i=1;i<=NF;i++)
if($i~/foo="/){ split($i,x,"\""); x[2]=x[2]<100?x[2]+1000:x[2]; $i="foo=\""x[2]"\""; }}1' yourFile
在上面的oneliner中,标准是foo属性值<100.
,您可以根据需要添加标准。比如(x[2]>100 && x[2]<700)
答案 2 :(得分:0)
TXR解决方案:
<!--@name-->
<Tree>
@(collect :gap 0)
<Node foo="@foo" bar="@bar" />
@ (set foo @(int-str foo))
@ (set foo @(if (< foo 0) (+ foo 1000) foo))
@(end)
</Tree>
@(output)
<!--Output.txt-->
<Tree>
@ (repeat)
<Node foo="@foo" bar="@bar" />
@ (end)
</Tree>
@(end)
执行命令
$ txr xml.txr -
<!--Origin.txt-->
<Tree>
<Node foo="600" bar="50" />
<Node foo="-300" bar="600" />
</Tree>
[Ctrl-D][Enter]
<!--Output.txt-->
<Tree>
<Node foo="600" bar="50" />
<Node foo="700" bar="600" />
</Tree>