2013-03-13 5 views
2

Я на самом деле решил это, составляя вопрос, но я думаю, что он может быть более аккуратным, чем то, как я это делал.обрезание пробелов внутри угловых скобок в sed

Я хотел обрезать пробелы и большинство пунктуации, кроме юридических документов (из rdf/n3 сущностей), которые появляются внутри <> s.

Пример исходного текста будет:
<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

+0

Надеюсь, вы понимаете, что вы не можете изменять символы в угловых скобках без изменения значения файла. Более того, «« »является зарезервированным символом в n3, и все, что генерирует такие файлы, сломано и должно быть исправлено. – Recurse

+0

Я понимаю, что мы генерируем n3, и хотя он был зафиксирован в нашем процессе импорта, я имел дело с партией n3, которая включала неизученные строки в IRI (в основном имена файлов, включая кавычки), их нужно было очистить, прежде чем мы может обрабатывать эту партию. – user1616353

ответ

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

ну это на самом деле не один лайнер, посмотреть, если есть и другие более короткие решения от других.

Смежные вопросы