使用sed查找和替换大文本文件中的通配符字符串

时间:2017-01-25 16:07:55

标签: html text sed

我需要在5MB文件中替换大量的HTML,而我试过的所有OS X编辑器都试图这样做。 sed似乎是答案,但写出正确的命令让我失望。我已经在这3个小时,最后寻求帮助!

这是一个例子 - 所有这些

</div><div class="fsm fwn fcg">Joined<br>Added by **Tiffany Seibel-Howard** on <abbr title="**Thursday, June 20, 2013 at 12:39am**" data-utime="**1371703149**"><span class="timestampContent">**June 20, 2013**</span></abbr></div></div><div class="_4bl7 mrm"></div></div></div></div></div></div></div></td><td class="_51m- vTop hLeft pam _51mw"><div class="_4-u2 _4-u8" data-name="GroupProfileGridItem" data-testid="GroupMember_**100002558935125**"><div class="clearfix"><a class="_8o _8r lfloat _ohe" href="**https://www.facebook.com/brookesblossoms?fref=grp_mmbr_list**" tabindex="-1" aria-hidden="true" data-hovercard="/ajax/hovercard/user.php?**id=100002558935125&amp;extragetparams=%7B%22fref%22%3A%22grp_mmbr_list%22%2C%22directed_target_id%22%3A479810992099587%7D**" data-hovercard-prefer-more-content-show="1"><img class="_s0 _rv img" src="./(2) Neuroblastoma Support group . You are Not Alone Ask Away._files/**10374531_827398764022080_7090816591123160699_n.jpg**" alt=""></a><div class="_8u _42ef"><div class="_6a _5u5j"><div class="_6a _6b" style="height:100px"></div><div class="_6a _5u5j _6b"><div class="fsl fwb fcb">

只要它出现在文件中,就需要删除。

**和**之间的任何部分都是通配符,它​​们将在整个文件中发生变化。

帮助!

1 个答案:

答案 0 :(得分:0)

您尝试执行的操作的问题是您有包含regexp元字符的文本(例如?),您需要将其视为文字,但您还需要将文本文本转换为regexp元字符(例如>**June 20, 2013**< - &gt; >[^<]+<)。要做到这一点,您首先要弄清楚如何表达文本中可以作为唯一描述性字符串更改的部分,例如:

</div><div class="fsm fwn fcg">Joined<br>Added by _NOT_LESS_THAN_ on <abbr title="_NOT_DOUBLE_QUOTE_" data-utime="_NOT_DOUBLE_QUOTE_"><span class="timestampContent">_NOT_LESS_THAN_</span></abbr></div></div><div class="_4bl7 mrm"></div></div></div></div></div></div></div></td><td class="_51m- vTop hLeft pam _51mw"><div class="_4-u2 _4-u8" data-name="GroupProfileGridItem" data-testid="GroupMember__NOT_DOUBLE_QUOTE_"><div class="clearfix"><a class="_8o _8r lfloat _ohe" href="_NOT_DOUBLE_QUOTE_" tabindex="-1" aria-hidden="true" data-hovercard="/ajax/hovercard/user.php?_NOT_DOUBLE_QUOTE_" data-hovercard-prefer-more-content-show="1"><img class="_s0 _rv img" src="./(2) Neuroblastoma Support group . You are Not Alone Ask Away._files/_NOT_DOUBLE_QUOTE_" alt=""></a><div class="_8u _42ef"><div class="_6a _5u5j"><div class="_6a _6b" style="height:100px"></div><div class="_6a _5u5j _6b"><div class="fsl fwb fcb">

然后清理文本中的所有正则表达式元字符(请参阅Is it possible to escape regex metacharacters reliably with sed),然后将上面使用的占位符字符串转换为regexps:

_NOT_LESS_THAN_    -> [^<]+
_NOT_DOUBLE_QUOTE_ -> [^"]+

然后你可以运行sed -E来删除文本。

你可能最好使用GNU awk,这样你可以将RS设置为上面的文本,这样你就不必一次将整个文件读入内存。