1

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}/では、文字列は最初の単語を変更するだけです。

誰かが私に適切な方法を教えてもらえますか?

更新:正規表現パターンはアポストロフィもカバーする必要があります

I'll BUY YOU A DRINK

ソリューションのほとんどは、文字I'をこのように分解します\textsc{i}'ll \textsc{buy you a} \textsc{drink}

4

3 に答える 3

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
}
于 2013-02-07T13:38:42.173 に答える
2

これはあなたのために働くはずのようです。

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、フレーズが単語の境界で開始および終了する必要があることを示しています(単語の途中ではありません)。前の3つのスラッシュtextscは、最後のを生成するための(エスケープの)エスケープ\textscです。([A-Z]+ [A-Z]+)+オールキャップスのフレーズをキャプチャすることです。最初に、のように文字クラスにスペースを追加しようとしました[A-Z ]が、これにより、のように中括弧の前にスペースができました\text{this sentence }。そこで、単語の真ん中にスペースを作り、フレーズを作成しました。

これにより、孤立した大文字の単語だけが残ることに注意してください。質問が「フレーズ」について尋ねるので、私はそれが意図されたと思いました。ただし、それらも置き換える必要がある場合は、次の方法を試してください。

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}
于 2013-02-07T07:37:58.460 に答える
1

これはあなたのために働くかもしれません(GNU sed):

sed -r 's/\b[A-Z]+\b( *\b[A-Z]+\b)*/\\textsc{\L&}/g' file
于 2013-02-07T17:16:53.477 に答える