【发布时间】: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 是一个更安全的解决方案。