【问题标题】:formatting files with sed/ python/ etc使用 sed/python/ 等格式化文件
【发布时间】:2012-01-11 10:04:04
【问题描述】:

我有一个由程序创建的文件。它包含 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

谢谢

【问题讨论】:

  • "现在如果之间只出现一次GETR,我想把它改成GETC。"你能解释一下这个说法吗?

标签: python formatting replace sed solaris


【解决方案1】:

这就是你想要的?

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

【讨论】:

  • 是的,有点意思,但我有点不清楚我已经修改了描述,不过谢谢
【解决方案2】:

这个怎么样 -

更新:

根据 Potong 的评论,这应该只用 $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 之类的新行替换。如果是这种情况,请手动按 Enter 进行换行。

sed -e '/$GETR/s/<\/td>/\
<\/td>/' -e 's/$GETR/\
$GETR/g' -e 's/$GETR/$GETC/g' ff 

【讨论】:

  • 不错的工作,但它可能有意想不到的副作用。提示可能还有其他 td's 和 GETR's 。
  • 感谢您的帮助,但有一些问题,我只想在每个 和 之间只有一个GETR标签时将GETR替换为GETC
  • 好的,那么您面临的问题是什么?您可以发布一些失败的示例数据吗?
  • 现在很好,其他答案对我有用,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多