2017-10-19 71 views
2

從命令行,如何在文本文件中改變大寫字母的每個第一個字?每行的第一個字的改變大小寫

示例輸入:

hello world 
tell me who you are! 

輸出示例:

HELLO world 
TELL me who you are! 

有沒有空行,它是ASCII,並且每一行以字母字後跟一個標籤開始。

使用工具:在命令行上工作的任何東西macOS(bash 3.2,BSD sed,awk,tr,perl 5,python 2.7,swift 4等)。

回答

1

使用awk單行:

awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file 
+1

輸出謝謝你,它適用於字後面加一個空格。但實際上,我發現我的數據有表格而不是空格。你會知道如何避免用SPACE替換TAB嗎? –

+0

剛剛更新了答案,以便'awk'將空格和製表符作爲分隔符。 – codeforester

+1

好的,我終於提出了一個完全適用於TAB的解決方案:'awk -F $'\ t''{OFS =「\ t」} {$ 1 = toupper($ 1)} 1'' –

1

使用GNU sed

sed 's/^\S*/\U&/g' file 

其中\S相匹配的非空白字符和\U&轉換爲大寫匹配的模式

UPDATE:在BSD sed因爲我t不與支持大多數的這些特殊字符,它仍然是可行的,但需要一個更長的表達

sed -f script file 

在腳本中含有

{ 
    h 
    s/ .*// 
    y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ 
    G 
    s/\(.*\)\n[^ ]* \(.*\)/\1 \2/ 
} 
+0

我認爲這樣做,'sed','awk','bash' - 覆蓋。 –

+0

對不起,沒有注意到它應該在macOS上。爲'BSD sed'和'GNU sed'增加了一個通用方法。我同意在'GNU sed'不可用的情況下'awk'腳本會更清晰。 – etopylight

+0

腳本替代工作:) –

1

你可以隨時使用bash大小寫轉換和while循環完成你的意圖,例如

$ while read -r a b; do echo "${a^^} $b"; done < file 
HELLO world 
HOW are you? 

參數擴展${var^^}所有字符轉換在var爲大寫,${var^}轉換的第一個字母。

猛砸3.2 ​​ - 'TR'

對於早期的bash,可以使用與tr相同的設置與herestring處理大小寫轉換:

$ while read -r a b; do echo "$(tr [a-z] [A-Z] <<<"$a") $b"; done file 
HELLO world 
HOW are you? 

保留\t人物

要保留製表符分隔的單詞,您必須防止在閱讀過程中發生分詞。不幸的是,對read-d選項不允許終止一組字符。檢查spacestab定界詞的方法是讀取整行禁用IFS=的文字分割,然後通過該行向前掃描,直到找到第一個文字$' '$'\t'。(該文字是bash的,只是,沒有POSIX外殼)一個簡單的實現是:

while IFS= read -r line; do 
    word= 
    ct=0 
    for ((i = 0; i < ${#line}; i++)); do 
     ct=$i 
     ## check against literal 'space' or 'tab' 
     [ "${line:$i:1}" = $' ' -o "${line:$i:1}" = $'\t' ] && break 
     word="${word}${line:$i:1}" 
    done 
    word="$(tr [a-z] [A-Z] <<<"$word")" 
    echo "${word}${line:$((ct))}" 
done <file 

tab分隔的單詞

HELLO world 
HOW  are  you? 
+0

哦,對不起,是的,這是有點早期的情況下轉換擴展':)' –

+0

@Cœur如果由於任何原因3.2沒有* herestring *,你可以做同樣的'$(echo「$ a」| tr [az] [AZ])',但最好避免使用管道。 –

+0

如果必須使用'tr','sed'或'awk'會更快。 *參數擴展*閃電般快,但是如果你數千次調用'tr',這可能是* stream編輯器的一個工作*'sed' ......':''記住每個*命令替換*(例如'$(....)'),每次調用'tr'都會產生單獨的子殼。 (我會好奇你的'時間sed ...'和'時間awk ...'比較......) –

相關問題