2009-09-22 51 views
1

我想在BBedit grep以下内容。帮助grep在BBEdit

查找:

<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> 

OR

查找:

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

替换为:

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

替换为

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

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

有什么想法?

回答

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> 

或者得到替换为票友:

<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> 

在最后一个示例中,您可能会遇到与其中包含空格的“社交网络”网址有关的问题。我不会推荐,但我想告诉你,你可以多次使用\ 1反向引用。

BBEdit手册中的Grep参考很棒。转到帮助 - >用户手册,然后第8章学习如何正确使用RegEx会改变你的生活。

UPDATE 奇怪的是,当我第一次看到它时,并没有向我展示你的完整例子。基于我现在看你应该

查找:

(.+?),\s? 

替换:

<dc:subject>\1</dc:subject>\r 
+0

谢谢crazyj!在单行上效果很好,但我试图清理RSS文件,因此这些行是长文档的一部分,我也需要查找这些文档。 我似乎无法发起寻找: (。+?),\ s? \ 1 \ r 你知道我会怎样做: 若要更换呢? – 2009-09-22 01:16:45

+0

您需要在结束标记中使用\ (。+?),\ s?<\/dc:subject>' – JCobb 2011-10-17 23:15:01

0

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

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

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

如果你把这个发布到谷歌组vim_use并要求一个Vim解决方案和它的相应的perl版本,你可能会得到一堆建议和一些在BBEdit中工作,然后还在perl中的任何编辑器之外。

+0

感谢您的帮助,唐。我不熟悉Vim,但会考虑它。我的桌面上有一个巨大的XML文件,我试图转换上面的文件,以便将其导入到新的数据库中。 – 2009-09-22 22:41:30

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 
+0

非常感谢。我对sed一点都不熟悉,但会看看我能否弄清楚。 – 2009-09-22 22:38:51

0

无法通过正常的grep做到这一点。但是,你可以添加的“Unix过滤”的BBEdit这样做对你的工作:

#!/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的过滤器添加到您的BBEdit可以在这个网址的“安装” - 第写着: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/

4

哇。很多复杂的答案在这里。如何发现:

, 

(有逗号后有一个空格)

,并替换:

</dc:subject>\r<dc:subject>