【发布时间】:2014-01-05 05:05:22
【问题描述】:
我需要弄清楚如何执行以下操作,并且想知道是否有人可以就 sed 的良好做法提供任何建议,或者更重要的是坏做法,这将有助于我完成这项任务。
基本上,我想逐行浏览文件并在 PATTERN1 上查找匹配项。一旦我找到匹配项,我想查找与 PATTERN2 匹配的下一行。如果我得到一个 PATTERN2 匹配,我想继续下一个 PATTERN1 匹配。如果我没有 PATTERN2 的匹配项,我想修改下一次出现的 PATTERN3 并对其进行修改。最后在 PATTERN2 或 PATTERN3 匹配时修改 PATTERN1 的所有匹配。
以下面为例:
<tr>
<td>
<input type="text" id="record_511568" value="PATTERN1" style="width:200px">
</td>
<td>2001-06-29 18:38:21</td>
<td>2014-06-29 18:38:21</td>
<td>
<select id="status_511568">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</td>
</tr>
我想匹配 PATTERN1 并检查下一次出现的 PATTERN2 (1)。
如果 PATTERN2 匹配,我想将其更改为 (<option value="1" selected="selected">1</option>)
如果 PATTERN2 不匹配,那么我想确保它匹配 PATTERN3 (<option value="1" selected="selected">1</option>)
通过每个 PATTERN1 逐步执行此操作。基本上将大型 HTML 表单修改为我在列表中预先确定的值。关于我可能遇到的一些陷阱的任何想法或关于与sed 进行多模式匹配的建议。
【问题讨论】:
-
您真的不想使用 SED 解析 HTML 或 XML 等标记语言。即使你设法回过头来理解你写的东西。这是 perl、python 或其他编程语言的工作。如果您必须使用最古老和最笨拙的工具来解决这个问题,请尝试使用 awk 或 gawk。
-
或者您可以使用带有 xml 扩展名的 hxextract 或 gawk
-
在上面的例子中,我只看到
pattern1而没有看到pattern2。这不是sed的工作。如果你有sed,你通常也会有awk。它更适合这种类型的逻辑。 -
必读答案@jordanm 已阅读、理解并牢记在心。我从一开始就错误地处理了这项任务,我想我会尝试使用 Javascript 进行修改