如果任何首行英文字母為小寫,則將其大寫
我有一個
myfile.md
帶有英文句子列表的降價文件,其中一些首字母小寫,一些大寫。所有英文句子都以標準英文字母開頭;不使用特殊字元:
X
X
X
我需要一個符合該邏輯的函式:
如果任何首行英文字母是小寫的,則將其大寫
因此,要將文件更改為如下所示:
X
X
X
我試過的
1)
tr
我想嘗試使用正則表達式來做到這一點
tr
,基於'tr '[:lower:]' '[:upper:]' myfile.md
但我既沒有找到將正則表達式組合tr
到tr
.相反,我只找到了一種在 shell 提示符下轉換文本的方法,如下所示:
echo x | tr '[:lower:]' '[:upper:]'
X
2)
sed
sed 's/^[a-z]*/[A-Z]/' myfile.md sed -r 's/^[a-z]*/[A-Z]/' myfile.md
但是在執行之後,
myfile.md
仍然包含X
X
X
反而:
X
X
X
我的問題
我如何在不使用任何 CLUI 文本編輯器(例如
nano
or )的情況下使用 shell 中描述的邏輯vim
?
使用
\U
GNU sed 中的函式。s/^\([a-z]\)/\U\1/
所以如果它是小寫的,這會在行的開頭擷取一個字元,然後將它的大寫。
由於 \U 不理會其他事情,因此可以將其簡化為
s/\(.\)/\U\1/
因為
.
將匹配該行的第一個字元(如果有)。
tr
在這裡對您沒有幫助,因為大寫 withtr
會將所有字元變成大寫(tr
只有一個字元一次的上下文,因此它永遠不會知道“行首”或“單詞的開頭” ”)。
sed
如果你使用 GNU 可以做到sed
。但是,您顯示的方式會將第一個大寫字元替換為文字 text[A-Z]
。由於這個問題被標記為posix,這是一個符合標準的
awk
解決方案,它將簡單地將任何行上的第一個字元大寫:awk '{ ch = toupper(substr($0,1,1)); sub(".", ""); $0 = ch $0; print }' file
該
awk
命令正在執行的操作是使用 提取行上的第一個字元substr()
。然後將其大寫並將其分配給變數ch
。然後使用刪除該行上的第一個字元,並將sub()
大寫字母ch
添加到該行之前。然後列印該行。測試這個:
$ cat file Apple orange grapefruit Mango
$ awk '{ ch = toupper(substr($0,1,1)); sub(".", ""); $0 = ch $0; print }' file Apple Orange Grapefruit Mango
如果數據有縮進(即行首有空格),則改為使用
awk '{ ch = toupper(substr($1,1,1)); sub(".", "", $1); $1 = ch $1; print }' file
(但是這會刪除縮進)。
如果您樂於使用 Perl 來執行此操作,則以下內容會將每行的第一個字元大寫,其方式類似於
awk
上面第一個程序的操作方式。perl -pe 'substr($_,0,1,uc(substr($_,0,1)))' file
雖然使用
perl -pe 's/^./\U$&/' file
會更短,更“Perl-like”。
^.
在該表達式中替換[^[:blank:]]
為替換行上的第一個非空白字元(這將保留任何縮進)。