2013-02-07 189 views
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 

大部分的解決方案打破信這樣\textsc{i}'ll \textsc{buy you a} \textsc{drink}

回答

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表示一個短語必須以單詞邊界開始和結束(不在單詞的中間)。在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} 
+0

對於第一個腳本來說看起來很不錯,但是它在「這個句子有很多上限」的情況下失敗了,輸出是'「\ textsc {這個句子h}如同許多上限' –

+0

Upda我的答案是處理這個案件。將\ b添加到正則表達式中 –

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 
} 
1

這可能爲你工作(GNU SED):

sed -r 's/\b[A-Z]+\b(*\b[A-Z]+\b)*/\\textsc{\L&}/g' file