(Bash?)脚本检查文件中的数字和约束,并为数字添加偏移量

时间:2012-03-26 12:14:19

标签: bash sed

我在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 / ...脚本来做这个;)

3 个答案:

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