форматирование файлов с помощью sed / python / etc - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть файл, который создается программой.Он содержит HTML-код и призывы к примирению с другим программным обеспечением.В этом файле есть много вариантов:

<td>$GETR("wp","1")$Yes$GETR("","2")$No$NOTE()$</td>

, поэтому это может быть:

<td>$GETR("dc","1")$Yes$GETR("","2")$NO$GETR("","3")$NA$NOTE()$</td>

или:

<td>$GETR("tc","1")$Yes$NOTE()$</td>

и т. Д.

Я создал скрипт, который правильно форматирует эти файлы, но с этим битом я застрял.Я хочу, чтобы скрипт выполнял поиск по файлу, и если он находит более одного GETR между ними, а затем помещает каждый GETR в новую строку с вкладкой, например:

<td>
    $GETR("wp","1")$Yes
    $GETR("","2")$No$NOTE()$ 
</td>

Теперь, если есть только одно вхождениеGETR между:

<td> and </td>

Я хотел бы изменить его на GETC, поэтому:

<td>$GETR("tc","1")$Yes$NOTE()$</td>

станет:

<td>
    $GETC("tc","1")$Yes$NOTE()$
</td>

Любые идеи, как я могусделай это?В настоящее время у меня есть сценарий bash, который выполняет некоторые перемещения и вызывает сценарий python для замены форматирования.

Я использую Sun Solaris 5.10

Спасибо

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Как насчет этого -

ОБНОВЛЕНИЕ:

Исходя из комментария от Потонга, следует заменить только строки на $ GETR.

[jaypal:~/Temp] cat ff
<td></td>
<td>$METR(dsdsd)$No(dsds)</td>
<td>$GETR("wp","1")$Yes$GETR("","2")$No$NOTE()$</td>
<td>$GETR("dc","1")$Yes$GETR("","2")$NO$GETR("","3")$NA$NOTE()$</td>
<td>$GETR("tc","1")$Yes$NOTE()$</td>

[jaypal:~/Temp] sed -e '/$GETR/s/<\/td>/\n<\/td>/' -e 's/$GETR/\n$GETR/g' -e 's/$GETR/$GETC/g' ff 
<td></td>
<td>$METR(dsdsd)$No(dsds)</td>
<td>
$GETC("wp","1")$Yes
$GETC("","2")$No$NOTE()$
</td>
<td>
$GETC("dc","1")$Yes
$GETC("","2")$NO
$GETC("","3")$NA$NOTE()$
</td>
<td>
$GETC("tc","1")$Yes$NOTE()$
</td>

В вашем окне Solaris вы не сможете заменить новыми строками, такими как \n.В этом случае нажмите ввод вручную для замены новой строки.

sed -e '/$GETR/s/<\/td>/\
<\/td>/' -e 's/$GETR/\
$GETR/g' -e 's/$GETR/$GETC/g' ff 
1 голос
/ 02 декабря 2011

Это то, что вы хотите?

>>> x='<td>$GETR("wp","1")$Yes$GETR("","2")$No$NOTE()$</td>'
>>> if x.count("$GETR")>1:
    x=x.replace("$GETR","\n\t$GETR").replace("</td>","\n</td>")


>>> print x
<td>
    $GETR("wp","1")$Yes
    $GETR("","2")$No$NOTE()$
</td>
>>> x='<td>$GETR("","2")$No$NOTE()$</td>'
>>> if x.count("$GETR")>1:
    x=x.replace("$GETR","\n\t$GETR").replace("</td>","\n</td>")


>>> print x
<td>$GETR("","2")$No$NOTE()$</td>

В таком случае попробуйте это

if x.count("$GETR")>=1:x=x.replace("$GETR","\n\t$GETR").replace("</td>","\n</td>")
if x.count("$GETR") == 1: x=x.replace("$GETR","$GETC")


>>> x='<td>$GETR("","2")$No$NOTE()$</td>'
>>> if x.count("$GETR")>=1:x=x.replace("$GETR","\n\t$GETR").replace("</td>","\n</td>")
>>> if x.count("$GETR") == 1: x=x.replace("$GETR","$GETC")
>>> print x
<td>
    $GETC("","2")$No$NOTE()$
</td>
>>> x='<td>$GETR("wp","1")$Yes$GETR("","2")$No$NOTE()$</td>'
>>> if x.count("$GETR")>=1:x=x.replace("$GETR","\n\t$GETR").replace("</td>","\n</td>")
>>> if x.count("$GETR") == 1: x=x.replace("$GETR","$GETC")
>>> print x
<td>
    $GETR("wp","1")$Yes
    $GETR("","2")$No$NOTE()$
</td>
>>> 
...