2017-07-25 32 views
-3
95 Latham Lane, Easton, PA 83755 

線在上面的一行最後字母表的最後一個索引,我想找到最後的字母索引的行「A」是字符串中的最後一個字母,我想在字符串中找到它的索引。檢查在UNIX

+6

你爲自己做了什麼? – Inian

+1

快速回答使用鏈接發佈爲重複:'var =「95 Latham Lane,Easton,PA 83755」; var2 =「$ {var%[:alpha:] *}」; echo $(($ {#var2} -1))' – Aserre

+3

除了添加你試過的東西(見[如何問]](https://stackoverflow.com/help/how-to-ask)和[mcve ](https://stackoverflow.com/help/mcve)),你也應該發佈期望的輸出......就像你想要'26'或'25',如果行沒有字母表,輸入中有多行所以... – Sundeep

回答

0

一種方式:

$ 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,該末尾應包含最後一個字符的索引。

0
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使用索引函數來獲得字符串中字母的索引。

+0

您的解決方案打印'1'作爲答案。 –

+0

是的,我誤解了這個問題。我已經修改了答案 –

0
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超量 - 計數的字符數。

+0

,或者您可以使用'echo ... | grep -o'。* [a-zA-Z]'| awk'{print length()}'' – Sundeep

0

你可以嘗試簡單易用的方法如下,讓我知道這是否對你有幫助。

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}' 
+1

我想你可以直接打印'RLENGTH'。 – CWLiu

+0

@CWLiu,謝謝我現在在解決方案中也添加了這個:) – RavinderSingh13

+0

它比你想象的更簡單,更容易:-)。請參閱https://stackoverflow.com/a/45311075/1745001 –

0
$ 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 
       } 
      }' 
0
$ echo '95 Latham Lane, Easton, PA 83755' | 
    awk '{print match($0,/[[:alpha:]][^[:alpha:]]*$/)}' 
26