95 Latham Lane, Easton, PA 83755
線在上面的一行最後字母表的最後一個索引,我想找到最後的字母索引的行「A」是字符串中的最後一個字母,我想在字符串中找到它的索引。檢查在UNIX
95 Latham Lane, Easton, PA 83755
線在上面的一行最後字母表的最後一個索引,我想找到最後的字母索引的行「A」是字符串中的最後一個字母,我想在字符串中找到它的索引。檢查在UNIX
一種方式:
$ str="95 Latham Lane, Easton, PA 83755"
$ echo $str | fold -w 1 | awk '/[a-zA-Z]/{x=NR}END{print x}'
26
$
fold
將包裝取決於寬度的線,在這種情況下1,這意味着每一個字符將是在一個新的線。使用awk
,我們搜索一個字符並將行號(NR
)分配給變量x
,並在末尾打印x
,該末尾應包含最後一個字符的索引。
var=$(sed -r 's/(^.*)([[:alpha:]])([[:blank:]][[:digit:]]+$)/\2/' <<< "95 Latham Lane, Easton, PA 83755")
awk -v let=$var '{ print index($0,toupper(let)) }' <<< "95 Latham Lane, Easton, PA 83755"
首先使用帶正則表達式的sed提取第二個提取的分離的單個字母,並將其讀入變量var。在awk中使用var來設置變量let使用索引函數來獲得字符串中字母的索引。
您的解決方案打印'1'作爲答案。 –
是的,我誤解了這個問題。我已經修改了答案 –
echo '95 Latham Lane, Easton, PA 83755' | grep -o '.*[a-zA-Z]' | tr -d '\n' | wc -c
說明:
echo '95 Latham Lane, Easton, PA 83755'
- 回聲您的字符串
grep -o '.*[a-zA-Z]'
- 在grep的貪婪地將盡可能多的字符匹配的可能是.*
和[a-zA-Z]
將匹配的最後一封信。 -o
標誌將告訴grep只打印匹配的字符。對於你的榜樣,這將是95 Latham Lane, Easton, PA
tr -d '\n'
- 刪除新行字符可以從grep的結果,以避免一個
wc -c
超量 - 計數的字符數。
,或者您可以使用'echo ... | grep -o'。* [a-zA-Z]'| awk'{print length()}'' – Sundeep
你可以嘗試簡單易用的方法如下,讓我知道這是否對你有幫助。
echo "95 Latham Lane, Easton, PA 83755" | awk '{match($0,/.*[a-zA-Z]/);print index($0,substr($0,RLENGTH,1))}'
OR
echo "95 Latham Lane, Easton, PA 83755" | awk '{match($0,/.*[a-zA-Z]/);print RLENGTH}'
我想你可以直接打印'RLENGTH'。 – CWLiu
@CWLiu,謝謝我現在在解決方案中也添加了這個:) – RavinderSingh13
它比你想象的更簡單,更容易:-)。請參閱https://stackoverflow.com/a/45311075/1745001 –
$ echo '95 Latham Lane, Easton, PA 83755' | awk '{n=split($0,a,"");while(n--){ if(a[n]~/[A-Za-z]/){print a[n],n; break }}}'
A 26
更好的可讀性
awk '{
n=split($0,a,"");
while(n--)
{
if(a[n]~/[A-Za-z]/)
{
print a[n],n; # a[n] gives alphabet, n gives index
break
}
}
}'
注意,標準說,如果 空字符串被分配到
FS
結果是不確定的。的awk
某些版本會產生 輸出,可能無法在OS X
或工作中FS=
$ echo '95 Latham Lane, Easton, PA 83755' | awk -v FS= '{i=NF; while(i--)if($i~/[A-Za-z]/){print $i,i; break}}'
A 26
更好的可讀性
awk -v FS= '{
i=NF;
while(i--)
if($i~/[A-Za-z]/)
{
print $i,i; break
}
}'
$ echo '95 Latham Lane, Easton, PA 83755' |
awk '{print match($0,/[[:alpha:]][^[:alpha:]]*$/)}'
26
你爲自己做了什麼? – Inian
快速回答使用鏈接發佈爲重複:'var =「95 Latham Lane,Easton,PA 83755」; var2 =「$ {var%[:alpha:] *}」; echo $(($ {#var2} -1))' – Aserre
除了添加你試過的東西(見[如何問]](https://stackoverflow.com/help/how-to-ask)和[mcve ](https://stackoverflow.com/help/mcve)),你也應該發佈期望的輸出......就像你想要'26'或'25',如果行沒有字母表,輸入中有多行所以... – Sundeep