2013-03-13 161 views
2

我在編寫問題的時候實際上已經解決了這個問題,但我認爲它可能比我做得更乾淨。在sed中修剪尖括號內的空白空間

我想修剪<> s內出現的網址合法內容(來自rdf/n3實體)以外的空白和大多數標點符號。

源文本的一個例子是:
<this is a problem> <this_is_fine> "this is ok too" . <http://WeDontNeedToTouchThis.> <http:ThisContains"Quotes'ThatWillBreakThings> "This should be 'left alone'." .

的輸出需要空間轉換爲下劃線和修剪的報價和任何不合法的URL中/ IRI。

<http://This is a "problem"> =><http://This_is_a_problem>

這些沒有工作。
sed -e 's/\(<[^ ]*\) \(.*>\)/\1_\2/g' badDoc.n3 | head sed '/</,/>/{s/ /_/g}' badDoc.n3 | head

我的最終解決,似乎工作是:
sed -e ':a;s/\(<[^> ]*\) \(.*>\)/\1_\2/g;ta' badDoc.n3 | sed -e ':b;s/\(<[:/%_a-zA-Z0-9.\-]*\)[^><:/%_a-zA-Z0-9.\-]\(.*>\)/\1\2/g;tb' > goodDoc.n3

有沒有更好的辦法?

+0

不明白你想要做什麼。源文本的輸出是什麼? – Kent 2013-03-13 09:57:20

+0

我希望你認識到,你不能改變文件的含義,不能改變尖括號內的字符。更重要的是,「'」是n3中的一個保留字符,任何生成此類文件的內容都會被破壞並應該被修復。 – Recurse 2013-03-14 02:44:52

+0

據我所知,我們正在生成n3,雖然它已在我們的導入過程中得到修復,但我正在處理一批包含IRI中未轉義字符串的n3(大多數文件名包括引號),這些需要在我們之前清理可以處理該批次。 – user1616353 2013-03-14 20:55:32

回答

1

首先,我會說這是一個有趣的問題。它看起來是一個簡單的替代問題,但如果進入它,它並不像我想象的那麼容易。當我在尋找解決方案時,我確實錯過了vim! ... :)

我不知道sed是否是這個問題必須的。我會用awk完成這件事:

awk '{t=$0; 
     while (match(t,/<[^>]*>/,a)>0){ 
       m[++i]=a[0];n[i]=a[0];t=substr(t,RSTART+RLENGTH) 
     } 
     for(x in n){ 
       gsub(/[\x22\x27]/,"",n[x]) 
       gsub(/ /,"_",n[x]) 
       sub(m[x],n[x]) 
     }}1' file 

測試了一下你的榜樣:

kent$ cat file 
<this is a problem> <this_is_fine> "this is ok too" . <http://WeDontNeedToTouchThis.> <http:ThisContains"Quotes'ThatWillBreakThings> "This should be 'left alone'." . 

kent$ awk '{t=$0; 
     while (match(t,/<[^>]*>/,a)>0){ 
       m[++i]=a[0];n[i]=a[0];t=substr(t,RSTART+RLENGTH) 
     } 
     for(x in n){ 
       gsub(/[\x22\x27]/,"",n[x]) 
       gsub(/ /,"_",n[x]) 
       sub(m[x],n[x]) 
     }}1' file 
<this_is_a_problem> <this_is_fine> "this is ok too" . <http://WeDontNeedToTouchThis.> <http:ThisContainsQuotesThatWillBreakThings> "This should be 'left alone'." . 

以及它是不是一個真正的一行代碼,看看是否有其他人其他較短的解決方案。