從命令行,如何在文本文件中改變大寫字母的每個第一個字?每行的第一個字的改變大小寫
示例輸入:
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等)。
從命令行,如何在文本文件中改變大寫字母的每個第一個字?每行的第一個字的改變大小寫
示例輸入:
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等)。
使用awk
單行:
awk -F$'\t' -v OFS=$'\t' '{ $1 = toupper($1) }1' file
使用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/
}
我認爲這樣做,'sed','awk','bash' - 覆蓋。 –
對不起,沒有注意到它應該在macOS上。爲'BSD sed'和'GNU sed'增加了一個通用方法。我同意在'GNU sed'不可用的情況下'awk'腳本會更清晰。 – etopylight
腳本替代工作:) –
你可以隨時使用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
選項不允許終止一組字符。檢查spaces
或tab
定界詞的方法是讀取整行禁用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?
哦,對不起,是的,這是有點早期的情況下轉換擴展':)' –
@Cœur如果由於任何原因3.2沒有* herestring *,你可以做同樣的'$(echo「$ a」| tr [az] [AZ])',但最好避免使用管道。 –
如果必須使用'tr','sed'或'awk'會更快。 *參數擴展*閃電般快,但是如果你數千次調用'tr',這可能是* stream編輯器的一個工作*'sed' ......':''記住每個*命令替換*(例如'$(....)'),每次調用'tr'都會產生單獨的子殼。 (我會好奇你的'時間sed ...'和'時間awk ...'比較......) –
輸出謝謝你,它適用於字後面加一個空格。但實際上,我發現我的數據有表格而不是空格。你會知道如何避免用SPACE替換TAB嗎? –
剛剛更新了答案,以便'awk'將空格和製表符作爲分隔符。 – codeforester
好的,我終於提出了一個完全適用於TAB的解決方案:'awk -F $'\ t''{OFS =「\ t」} {$ 1 = toupper($ 1)} 1'' –