2015-10-03 3 views
1

Как найти несколько слов, которые могут быть разделены символами новой строки, не удаляя символы новой строки?обработка текста: найти несколько слов, разделенных символом новой строки

E.g.

The promotion and merchandise aided the success of We Are 
the World and raised over $63 million for humanitarian 
aid in Africa and the US. 

Использование СЭД (или любой другой инструмент для обработки текстов * Никс, например, AWK, Perl) для поиска We Are the World и заменить его, например, <song title> так выглядит как:

The promotion and merchandise aided the success of <song title> 
and raised over $63 million for humanitarian 
aid in Africa and the US. 

У меня есть куча поисковых шаблонов (названия песен), которые я хочу найти куски текста для и заменить все из них с <song title>. Я не хочу удалять новые строки.

ответ

1
$ cat tst.awk 
BEGIN { gsub(/ +/,"[[:space:]]+",old); old = tolower(old) } 
{ tail = tail $0 RS } 
END { 
    head = "" 
    while (match(tolower(tail),old)) { 
     trgt = substr(tail,RSTART,RLENGTH) 
     head = head substr(tail,1,RSTART-1) new 
     tail = substr(tail,RSTART+RLENGTH) 
     if (trgt ~ RS) { 
      head = head RS 
      sub(/^[[:blank:]]+/,"",tail) 
     } 
    } 
    printf "%s%s", head, tail 
} 

$ awk -v old='we are the world' -v new='<song title>' -f tst.awk file 
The promotion and merchandise aided the success of <song title> 
and raised over $63 million for humanitarian 
aid in Africa and the US. 

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

+1

Ницца! Он работает очень хорошо. – wivku

+0

Возможно, вы захотите протестировать его с некоторыми другими вариантами ввода и посмотреть, есть ли у вас какие-либо другие требования, которые необходимо обработать, например. несколько новых строк в имени старой песни, старое название песни, содержащее новую строку, но за которым следует пунктуация вместо пробела. и т. д. и т. д. Что, если старое название песни было обычным словом или фразой типа «Чистое» - как вы узнаете, замените ли вы название песни или просто слово «Песня Pure by Lightning Seed - это хорошо. !». Я сделал все мои тесты без учета регистра - возможно, это не то, что вы хотите, но я думаю, что вам это нужно. –

+1

Вы правы, в общих случаях это следует иметь в виду. В моем случае «песни» - это все уникальные строки и не будут отображаться как обычный текст. И да, регистр без учета регистра не запрашивался, но действительно полезен. – wivku

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