我在撰写问题时实际上解决了这个问题,但我认为它可能比我做的更简洁。
我想修剪空格和大多数标点符号,除了出现在<> s内的url合法内容(来自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">
=&gt; <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 :(得分: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'." .
好吧,这不是一个单行,看看是否有其他更短的解决方案。