【问题标题】:conditional deletion of lines in xml file using sed使用 sed 有条件地删除 xml 文件中的行
【发布时间】:2015-10-17 23:33:54
【问题描述】:

这个问题可能没有一个直截了当的答案......如果是这样,不用担心。我有一个类似于

的 XML 文件
<a>0.00</a>
<b>0.00</b>
<c>0.00</c>
<d>0.00</d>

这是我正在使用的简化版本。我的目标是删除任何数据点为零的行,当且仅当所有数据点都为零时(如我上面给出的示例)。即使文件中的其中一行包含非零条目,我也无法删除其中任何一行。例如,如果上面是

<a>0.00</a>
<b>0.00</b>
<c>1.00</c>
<d>0.00</d>

那么文件应该保持不变。最终,我只想删除所有行,如果它们在每个标签中都为零,并保持文件不变。我知道如果所有行的数据条目为零,以下将起作用。

sed --in-place '\|>0.00</|d' $FILENAME 

但是,如果我有下面的第二个示例,这将给我留下

<c>1.00</c>

这不是我要找的。我知道我可能需要一个 if 语句,比如

if (all lines contain the string '>0.00</') then
   sed --in-place '\|>0.00</|d' $FILENAME 
fi

我想这是我不确定的 if 语句中的条件。我将如何说明“如果所有行都包含上述字符串”?我不一定必须使用 sed,我过去曾使用过 awk,但我对 sed 最满意....任何正确方向的输入或指针将不胜感激。谢谢

【问题讨论】:

  • 您正在寻找的答案是不使用 sed。您想使用可以理解 XML 的东西。 XSLT 或 perl、python、ruby 等以及对元素的循环,甚至可能只是可以执行 XPath 选择器的东西。但是任何纯粹基于文本的东西都会使这变得更加复杂。
  • 我有一种感觉,这将是答案......不过,非常感谢您的及时回复。
  • 如果您的输入受到足够的约束和规则,您可以得到一个纯文本解决方案,但几乎任何偏差都会(在最不可能)打破它。
  • 不幸的是,这个文件可以并且将采用原始帖子中提到的任何形式,因此它肯定会偏离 - 并因此“破坏”它。我需要调查一条不同的路线来采取我的想法。感谢您的意见。
  • 在这种情况下,偏差更多是关于 xml 内容,而不是数据本身。这意味着如果您可以断言您将始终且仅拥有看起来完全一样的行(无论元素内容是什么),并且这些将是父元素(或其他)中唯一的 xml 元素,那么您可以使用 awk 执行此操作/等等。但是 XSLT/xmlstarlet/scripting 是一个更安全的解决方案。

标签: xml linux bash sed


【解决方案1】:
grep -vq ">0.00<" $FILENAME || sed -i '\|>0.00<|d' $FILENAME

第二个命令被执行,只有文件在所有行中都包含 0.00。

【讨论】:

  • 哇!!这非常简单,而且工作得非常完美......这正是我想要的!谢谢
猜你喜欢
  • 2017-04-10
  • 2020-11-22
  • 2012-06-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2023-04-09
相关资源
最近更新 更多