1

我想在 BBedit 中 grep 以下内容。

寻找:

<dc:subject>Knowledge, Mashups, Politics, Reviews, Ratings, Ranking, Statistics</dc:subject>

用。。。来代替:

<dc:subject>Knowledge</dc:subject>
<dc:subject>Mashups</dc:subject>
<dc:subject>Politics</dc:subject>
<dc:subject>Reviews</dc:subject>
<dc:subject>Ratings</dc:subject>
<dc:subject>Ranking</dc:subject>
<dc:subject>Statistics</dc:subject>

或者

寻找:

<dc:subject>Social web, Email, Twitter</dc:subject>

用。。。来代替:

<dc:subject>Social web</dc:subject>
<dc:subject>Email</dc:subject>
<dc:subject>Twitter</dc:subject>

基本上,当有多个类别时,我需要找到逗号和空格,添加换行符并将打开/关闭包裹在类别周围。

有什么想法吗?

4

5 回答 5

4

哇。这里有很多复杂的答案。怎么找:

, 

(逗号后面有空格)

并替换为:

</dc:subject>\r<dc:subject>
于 2011-05-12T17:25:36.057 回答
1

寻找:

(.+?),\s?

代替:

\1\r

我不确定您所说的“围绕类别包装打开/关闭”是什么意思,但如果您想将其包装在某种标签或链接中,只需将其添加到替换中。

代替:

<a href="http://example.com/">\1</a>\r

会给你

<a href="http://example.com/">Social web</a>
<a href="http://example.com/">Email</a>
<a href="http://example.com/">Twitter</a>

或者通过 Replace 变得更漂亮:

<a href="http://example.com/tag/\1/">\1</a>\r

会给你

<a href="http://example.com/tag/Social web/">Social web</a>
<a href="http://example.com/tag/Email/">Email</a>
<a href="http://example.com/tag/Twitter/">Twitter</a>

在最后一个示例中,您可能会遇到“社交网络”URL 中有空格的问题。我不建议这样做,但我想向您展示您可以多次使用 \1 反向引用。

BBEdit 手册中的 Grep 参考非常棒。转到帮助->用户手册,然后转到第 8 章。学习如何使用 RegEx 将改变您的生活。

更新 很奇怪,当我第一次看到这个时,它并没有向我展示你的完整示例。根据我现在看到的,你应该

寻找:

(.+?),\s?

代替:

<dc:subject>\1</dc:subject>\r
于 2009-09-22T00:34:30.073 回答
0

你不能通过普通的 grep 来做到这一点。但是您可以为 BBEdit 添加一个“Unix 过滤器”来为您完成这项工作:

#!/usr/bin/perl -w

while(<>) {
my $line = $_;
$line =~ /<dc:subject>(.+)<\/dc:subject>/;
my $content = $1;
my @arr;

if ($content =~ /,/) {
    @arr = split(/,/,$content);
}
my $newline = '';
foreach my $part (@arr) {
    $newline .= "\n" if ($newline ne '');
    $part =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/; 
    $newline .= "<dc:subject>$part</dc:subject>";
}
print $newline;
}

如何将此 UNIX-Filter 添加到 BBEdit,您可以在此 URL 的“安装”部分阅读:http ://blog.elitecoderz.net/windows-zeichen-fur-mac-konvertieren-und-umgekehrt-filter-fur -bbeditconverting-windows-characters-to-mac-and-vice-versa-filter-for-bbedit/2009/01/

于 2010-07-08T08:00:30.463 回答
0

您也可以使用 sed 来执行此操作,理论上您只需将“,”替换为关闭和打开<dc:subject>以及中间的换行符,然后输出到新文件。但是sed 似乎不喜欢 html 尖括号...我尝试转义它们,但在包含它们时仍然会收到错误消息。到目前为止,这是我所有的时间,所以如果我有机会回到它,我会的。也许其他人可以解决尖括号问题:

sed s/, /</dc:subject>\n<dc:subject>/g file.txt > G:\newfile.txt

好吧,我想我明白了。基本上必须将包含尖括号的替换文本放在双引号中,并将 sed 使用的分隔符更改为正斜杠以外的其他内容,因为这是在替换文本中并且 sed 不喜欢它。我对 grep 了解不多,但读到 grep 只是匹配的东西,而 sed 将替换,所以对于这种类型的东西更好:

sed s%", "%"</dc:subject>\n<dc:subject>"%g file.txt > newfile.txt
于 2009-09-22T19:05:13.557 回答
0

我不使用 BBEdit,但在 Vim 中你可以这样做:

%s/(_[^<]+)</dc:subject>/\=substitute(submatch(0), ",[ \t]*", "</dc:subject>\r", "g" )/G

它将处理跨越带有换行符的内容的多行和标签。它也处理多行,但并不总是在关闭和开始标记之间获得换行符。

如果您将其发布到 google 组 vim_use 并要求提供 Vim 解决方案及其相应的 perl 版本,您可能会得到一堆建议和一些在 BBEdit 中有效的东西,然后在 perl 中的任何编辑器之外。

大学教师

于 2009-09-22T18:14:15.347 回答