2

質問を作成しながら実際にこれを解決しましたが、私がやった方法よりもきれいかもしれないと思います。

<>内に表示される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">=><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

もっと良い方法はありますか?

4

1 に答える 1

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'." .

それは実際にはワンライナーではありません。他の人からの他の短い解決策があるかどうかを確認してください。

于 2013-03-14T21:40:53.593 に答える