Text-Processing

如果任何首行英文字母為小寫,則將其大寫

  • March 4, 2020

我有一個myfile.md帶有英文句子列表的降價文件,其中一些首字母小寫,一些大寫。

所有英文句子都以標準英文字母開頭;不使用特殊字元:

X

X

X

我需要一個符合該邏輯的函式:

如果任何首行英文字母是小寫的,則將其大寫

因此,要將文件更改為如下所示:

X

X

X

我試過的

1)tr

我想嘗試使用正則表達式來做到這一點tr,基於'tr '[:lower:]' '[:upper:]' myfile.md 但我既沒有找到將正則表達式組合trtr.

相反,我只找到了一種在 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 文本編輯器(例如nanoor )的情況下使用 shell 中描述的邏輯vim

使用\UGNU 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:]]為替換行上的第一個非空白字元(這將保留任何縮進)。

引用自:https://unix.stackexchange.com/questions/556900