Как изменить случай для такого случая как это?

Я хотел бы использовать sed, или что-то подобное, чтобы читать в текстовом файле и изменить все случаи заглавных фраз к строчным буквам обернуло \textsc { * *}.

Например:

THIS SENTENCE IS ALL CAPS except not really

должен стать

\textsc{this sentence is all caps} except not really

Если

This Sentence Has Many Caps

Должен остаться

This Sentence Has Many Caps  

с этим образцом s/\(. [A-Z] * \)/textsc {\\L\1}/, последовательность просто изменяет первое слово.

Кто-либо мог указать мне надлежащий путь?

Updated: The regex pattern should cover apostrophes as well

I'll BUY YOU A DRINK

Most of solution break down letter I and ' like this \textsc{i}'ll \textsc{buy you a} \textsc{drink}

1
nl ja de

3 ответы

$ cat file
THIS SENTENCE IS ALL CAPS except not really
This Sentence Has Many Caps
THIS SENTENCE Has Many Caps

$ awk -f tst.awk file
\textsc{this sentence is all caps} except not really
This Sentence Has Many Caps
\textsc{this sentence} Has Many Caps

$ cat tst.awk
{
   while ( match( $0, /([[:upper:]]{2,}[[:space:]]*)+/) ) {
      rstart  = RSTART
      rlength = RLENGTH

      if ( match( substr($0,RSTART,RLENGTH), /[[:space:]]+$/) ) {
         rlength = rlength - RLENGTH
      }

      $0 = substr($0,1,rstart-1) \
           "\\textsc{" tolower(substr($0,rstart,rlength)) "}" \
           substr($0,rstart+rlength)
   }

   print
}
3
добавлено

Это похоже на него, должен работать на вас.

echo "THIS sentence IS ALL CAPS Except not really BUT THIS IS" | \
  sed -re "s/\b(([A-Z]+ [A-Z]+)+)\b/\\\textsc{\L\1}/g"

Это приводит к этой фразе:

THIS sentence \textsc{is all caps} Except not really \textsc{but this is}

/g для глобального, заменяют (не только первый матч). \b говорит, что фраза должна начаться и закончиться на границе слова (не посреди слова). Три разреза перед тексты являются спасением (спасения), чтобы произвести финал \textsc . ([A-Z] + [A-Z] +) + должен захватить фразу всех заглавных букв. Я сначала пытался добавить пространство в класс символов, как в [A-Z] , но это привело к пространству перед вьющейся скобой, как в \text {это предложение} . Таким образом, я встроил пространство в середину слов, чтобы создать фразу.

Обратите внимание, что это оставляет изолированные uppercased слова одними. Я предположил, что это было предназначено, так как вопросы спрашивают о "фразах". Но если необходимо заменить тех также, попробуйте этого:

echo "THIS sentence IS ALL CAPS Except not really BUT THIS IS" | \
  sed -re "s/\b((([A-Z]+ [A-Z]+)+)|[A-Z]+)\b/\\\textsc{\L\1}/g"

который приводит к

\textsc{this} sentence \textsc{is all caps} Except not really \textsc{but this is}
2
добавлено
Это кажется хорошим для первого сценария, но это подводит со случаем "ЭТО ПРЕДЛОЖЕНИЕ, Имеет Много заглавных букв", продукция " \textsc {это предложение h} как Много заглавных букв
добавлено автор Hoan Dang, источник
Обновленный мой ответ, чтобы обращаться с этим случаем. Добавленный \b' s в regex
добавлено автор Cody A. Ray, источник

Это могло бы работать на вас (ГНУ sed):

sed -r 's/\b[A-Z]+\b( *\b[A-Z]+\b)*/\\textsc{\L&}/g' file
1
добавлено