2009-09-22 73 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>