2013-03-13 82 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'." . 

以及它是不是一个真正的一行代码,看看是否有其他人其他较短的解决方案。