(Bash?) Скрипт для проверки файла на наличие чисел и ограничений и добавления смещения к числу - PullRequest
1 голос
/ 26 марта 2012

Я ищу инструмент (цепочку) (sed / bash / ...) в Linux, чтобы добиться следующего: пройтись по текстовому файлу (здесь: XML), найти те же значения, проверить эти значения на некоторое правило и исправить ихзначения путем добавления смещения.

Примером может быть:

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

Теперь я не хочу полностью игнорировать bar, но проверь, если, например, foo меньше нуля.Если это так, добавьте 1000 к foo.Если нет, оставьте его.

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

Я мог бы написать небольшую программу на python / java, но держу пари, что для этого есть более быстрый скрипт bash / sed / ...;)

Ответы [ 3 ]

0 голосов
/ 26 марта 2012

откройте ваш файл с помощью 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

в вышеупомянутом oneliner, критерием является значение атрибута foo <100., вы можете добавлять критерии по своему усмотрению.как (x[2]>100 && x[2]<700)

0 голосов
/ 26 марта 2012

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>
0 голосов
/ 26 марта 2012

В одну сторону, используя 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...