2016-11-23 150 views
1

我寫了一個程序,該程序應該將example.txt中的單詞從最長寫到最短。我不知道'^.{$v}$'應該如何讓它工作?bash中的命令變量

#!/bin/bash 
v=30 

while [ $v -gt 0 ] ; do 
    grep -P '^.{$v}$' example.txt 
    v=$(($v - 1)) 
done 

我想:

  • ${v}
  • $v
  • "$v"

這是我的第一個問題,遺憾的任何錯誤:)

+1

第一個Q不壞,至少你已經試圖解決你的問題。在未來(對於Q而言不是那麼多),包含A.一小套樣本數據非常有幫助,它涵蓋了您期望處理的所有情況以及一個不會被處理的項目; B.該輸入所需的輸出,包括未得到處理的記錄C.您的代碼/當前輸出/錯誤消息。 D.你的想法是爲什麼你的代碼應該工作(我們將幫助你解決你對事情工作的理解)。祝你好運! – shellter

回答

1

使用:

grep -P "^.{$v}$" example.txt 
2

你在做什麼不是你如何處理這個問題在shell中。閱讀why-is-using-a-shell-loop-to-process-text-considered-bad-practice學習的一些問題,然後你這是怎麼會真正做到你想在一個shell腳本做什麼:

$ cat file 
now 
is 
the 
winter 
of 
our 
discontent 

$ awk -v OFS='\t' '{print length($0), NR, $0}' file | sort -k1rn -k2n | cut -f3- 
discontent 
winter 
now 
the 
our 
is 
of 

要理解那是什麼做什麼,看看AWK輸出:

$ awk -v OFS='\t' '{print length($0), NR, $0}' file 
3  1  now 
2  2  is 
3  3  the 
6  4  winter 
2  5  of 
3  6  our 
10  7  discontent 

第一個數字是每行的長度,第二個數字是行出現在輸入文件中,以便順序的時候,纔對其進行排序:

$ awk -v OFS='\t' '{print length($0), NR, $0}' file | sort -k1rn -k2n 
10  7  discontent 
6  4  winter 
3  1  now 
3  3  the 
3  6  our 
2  2  is 
2  5  of 

我們CA按-k1rn的長度排序(最長的第一個),但通過添加-k2n,保留輸入文件中相同長度的行的順序。然後cut只刪除awk添加的sort使用的2個主要數字。