我有三種類型的字符串,我想在bash腳本中大寫。我想sed/awk是我最好的選擇,但我不確定。根據以下要求,最佳方法是什麼?sed/awk大寫字符串
1.)單個詞 例如, taco -> Taco
2.)用連字符分隔的多個詞 例如, my-fish-tacos -> My-Fish-Tacos
3.)用下劃線分隔的多個詞 例如, my_fish_tacos -> My_Fish_Tacos
我有三種類型的字符串,我想在bash腳本中大寫。我想sed/awk是我最好的選擇,但我不確定。根據以下要求,最佳方法是什麼?sed/awk大寫字符串
1.)單個詞 例如, taco -> Taco
2.)用連字符分隔的多個詞 例如, my-fish-tacos -> My-Fish-Tacos
3.)用下劃線分隔的多個詞 例如, my_fish_tacos -> My_Fish_Tacos
有沒有必要使用捕捉組(雖然&
在某種程度上是一個):
echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g'
輸出:
Taco My-Fish-Tacos My_Fish_Tacos
的轉義小寫「u」大寫匹配子字符串中的下一個字符。
嘗試以下操作:
sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g'
它使用GNU sed的工作對我來說,但我不認爲BSD sed的支持\U
和\L
。
用awk:
echo 'test' | awk '{
for (i=1; i <= NF; i++) {
sub(".", substr(toupper($i), 1,1) , $i);
print $i;
# or
# print substr(toupper($i), 1,1) substr($i, 2);
}
}'
解釋關於上面的例子有點: ** ** NF - 內置AWK變量來自字段數(通常表明你有多少個空格分隔字符串有一個行) - 在這個例子中它會返回1 ** substr ** - 返回substring,聲明看起來像這樣** substr(string,start,length)**。 ** sub ** - 替代函數 - ** sub(正則表達式,替換,目標)** – 2016-01-12 00:47:00
注意:使用toupper(substr(...'而不是'substr(toupper() '。 – 2016-04-14 17:15:20
這是一個不使用\u
的解決方案,對所有的seds都不常見。
保存此文件到capitalize.sed
,然後運行sed -i -f capitalize.sed FILE
s:^:.:
h
y/qwertyuiopasdfghjklzxcvbnm/QWERTYUIOPASDFGHJKLZXCVBNM/
G
s:$:\n:
:r
/^.\n.\n/{s:::;p;d}
/^[^[:alpha:]][[:alpha:]]/ {
s:.\(.\)\(.*\):x\2\1:
s:\n\(..\):\nx:
tr
}
/^[[:alpha:]][[:alpha:]]/ {
s:\n.\(.\)\(.*\)$:\nx\2\1:
s:..:x:
tr
}
/^[^\n]/ {
s:^.\(.\)\(.*\)$:.\2\1:
s:\n..:\n.:
tr
}
這可能會爲你工作(GNU SED):
echo "aaa bbb ccc aaa-bbb-ccc aaa_bbb_ccc aaa-bbb_ccc" | sed 's/\<.\|_./\U&/g'
Aaa Bbb Ccc Aaa-Bbb-Ccc Aaa_Bbb_Ccc Aaa-Bbb_Ccc
alinsoar的令人興奮的解決方案不會的Plan9在所有的工作sed,或在busybox sed中正確。但你仍應該試着弄清楚它應該如何做到這一點:你會學到很多關於sed的知識。
這裏有一個不爲高明,但更容易理解的版本,在至少的Plan9,busybox的工作,以及GNU sed的(也可能是BSD和MacOS)。 Plan9 sed需要在s
命令的匹配部分中刪除反斜槓。
#! /bin/sed -f
y/PYFGCRLAOEUIDHTNSQJKXBMWVZ/pyfgcrlaoeuidhtnsqjkxbmwvz/
s/\(^\|[^A-Za-z]\)a/\1A/g
s/\(^\|[^A-Za-z]\)b/\1B/g
s/\(^\|[^A-Za-z]\)c/\1C/g
s/\(^\|[^A-Za-z]\)d/\1D/g
s/\(^\|[^A-Za-z]\)e/\1E/g
s/\(^\|[^A-Za-z]\)f/\1F/g
s/\(^\|[^A-Za-z]\)g/\1G/g
s/\(^\|[^A-Za-z]\)h/\1H/g
s/\(^\|[^A-Za-z]\)i/\1I/g
s/\(^\|[^A-Za-z]\)j/\1J/g
s/\(^\|[^A-Za-z]\)k/\1K/g
s/\(^\|[^A-Za-z]\)l/\1L/g
s/\(^\|[^A-Za-z]\)m/\1M/g
s/\(^\|[^A-Za-z]\)n/\1N/g
s/\(^\|[^A-Za-z]\)o/\1O/g
s/\(^\|[^A-Za-z]\)p/\1P/g
s/\(^\|[^A-Za-z]\)q/\1Q/g
s/\(^\|[^A-Za-z]\)r/\1R/g
s/\(^\|[^A-Za-z]\)s/\1S/g
s/\(^\|[^A-Za-z]\)t/\1T/g
s/\(^\|[^A-Za-z]\)u/\1U/g
s/\(^\|[^A-Za-z]\)v/\1V/g
s/\(^\|[^A-Za-z]\)w/\1W/g
s/\(^\|[^A-Za-z]\)x/\1X/g
s/\(^\|[^A-Za-z]\)y/\1Y/g
s/\(^\|[^A-Za-z]\)z/\1Z/g
我該如何修改它以處理全部大寫的單詞?例如my-FISH-TACOS應輸出My-Fish-Tacos – GregB 2012-08-06 06:09:06
@GregB:告訴它將所有字符小寫,然後小寫所有字符: 'sed's/[^ _-] */\ L \ u&/ g'' – 2012-08-06 10:32:13
注意:這是一個GNU sed擴展。BSD sed用戶(包括OS X)無法做到這一點。 – Jashank 2014-03-03 03:56:55