Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Bash?)脚本,用于检查文件中的编号和约束,并向编号添加偏移量_Bash_Sed - Fatal编程技术网

(Bash?)脚本,用于检查文件中的编号和约束,并向编号添加偏移量

(Bash?)脚本,用于检查文件中的编号和约束,并向编号添加偏移量,bash,sed,Bash,Sed,我在Linux中搜索一个工具(chain)(sed/bash/…),以实现以下目的:遍历一个文本文件(这里是XML)找到相同的值,检查这些值是否符合某些规则,并通过添加偏移量来更正这些值 例如: <!--Origin.txt--> <Tree> <Node foo="600" bar="50" /> <Node foo="-300" bar="600" /> </Tree> 我现在不想完全忽略bar,但要检查例如foo是否

我在Linux中搜索一个工具(chain)(sed/bash/…),以实现以下目的:遍历一个文本文件(这里是XML)找到相同的值,检查这些值是否符合某些规则,并通过添加偏移量来更正这些值

例如:

<!--Origin.txt-->
<Tree>
  <Node foo="600" bar="50" />
  <Node foo="-300" bar="600" />
</Tree>

我现在不想完全忽略bar,但要检查例如foo是否小于零。如果是,则向foo添加1000。如果没有,请留下它

<!--Output.txt-->
<Tree>
  <Node foo="600" bar="50" />
  <Node foo="700" bar="600" />
</Tree>


我可以编写一个小型python/java程序,但我敢打赌有一个更快的bash/sed/。。。执行此操作的脚本;)

单向使用
perl

填充的内容

<!--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
perl-pe'

s/\A(\s*使用vim打开文件,然后键入:

:%s/foo="\zs\(-[0-9]\+\)"\ze/\=submatch(1)+1000/g
它应该可以完成4 u的任务

编辑

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
awk'{for(i=1;iTXR解决方案:

<!--@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)

@(收集:间隙0)
@(set foo@(int str foo))
@(设置foo@(如果(
运行:

$txr xml.txr-
[Ctrl-D][Enter]

我的装备上没有安装Perl,但解决方案优雅而简短!我引用自己的话“检查例如foo是否小于零”…实际上我需要检查一个值是否在某个范围内…在VIM中如何?@powerbar您应该在问题中正确描述您的需求。无论如何,请参阅我的编辑,以回答您的新需求(范围内容)我以前不知道TXR,但会在我有空闲的时候研究它!谢谢你发布了一个不寻常的解决方案!顺便说一句,我的方法也很有效。但是对于大文件来说太慢了,因为它需要O(n²):在一个shell脚本中,我通过sed提取了所有值,逐个检查它们,如果通过sed不同,则替换它们。Kent的解决方案更好!
<!--@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>