2017-03-17 78 views
2

我創造了這個基本的腳本:如何根據給定數量的字母顯示單詞?

#!/bin/bash 

file="/usr/share/dict/words" 
var=2 
sed -n "/^$var$/p" /usr/share/dict/words 

然而,由於要求是它不工作(或者還需要一些更多的邏輯,把它)。

這裏,應該只打印2個字母的單詞,但這個被賦予不同的輸出

任何人都可以提出關於如何使用sed或awk來實現這個想法?

+1

順便說一下,'$ file'變量在這裏看起來沒用,因爲你以後不會在'sed'調用中使用它。 – fedorqui

回答

3

你所執行的是:

sed -n "/^2$/p" /usr/share/dict/words 

這意味着:由完全相同的號碼2,其他什麼都行。當然這不會返回任何東西,因爲/usr/share/dict/words有詞彙而不是數字(據我所知)。

如果你想打印一個以兩個字符的行,你需要使用類似..(因爲.匹配任何字符):

sed -n "/^..$/p" /usr/share/dict/words 

爲了使字符數變量,可以使用一個量詞{}像(注意\使用已經用sed的BRE理解正確):

sed -n "/^.\{2\}$/p" /usr/share/dict/words 

或者,用一個變量:

sed -n '/^.\{'"$var"'\}$/p' /usr/share/dict/words 

請注意,我們將變量放在安全報價之外(感謝Ed Morton在提醒的評論中)。

+1

'+ 1'。 FWIW我總是嘗試儘可能地本地化shell變量擴展,例如'sed -n'/^.\{'"$ var''\} $/p'',以避免在shell解釋腳本的其餘部分時出現任何意外。 –

+0

@EdMorton謝謝!在這種情況下會發生什麼?我的意思是,在哪些情況下我的方法會出現意想不到的行爲? – fedorqui

+1

你的腳本會很好,但通常情況下最好是防止問題發生。就像引用shell變量一樣 - 在許多情況下,它並不重要,但最好是在那些時候採取這種做法的習慣。 –

4

應該只打印2個字母的單詞

sed命令只搜索與文本2行。

您可以使用awk此:

awk 'length() == 2' file 

或使用shell變量:

awk -v n=$var 'length() == n' file 
+1

awk長度函數很棒 – Kshitij8097

+1

默認長度爲'$ 0',所以也可以使用'awk'長度== n'' – Sundeep

+0

非常好的一點@Sundeep。我忘了這個,現在編輯它。 – anubhava

1

嘗試awk -

awk -v var=2 '{if (length($0) == var) print $0}' /usr/share/dict/words 

這可以縮短到

awk -v var=2 'length($0) == var' /usr/share/dict/words 

它具有相同的效果。

1

只輸出匹配2個字母字符使用grep行:

grep '^[[:alpha:]]\{2\}$' /usr/share/dict/words 
2

純的bash ...:)

file="/usr/share/dict/words" 
var=2 

#building a regex 
str=$(printf "%${var}s") 
re="^${str// /.}$" 

while read -r word 
do 
    [[ "$word" =~ $re ]] && echo "$word" 
done < "$file" 

它建立一個正則表達式的形式^..$(點的數量是可變的)。所以分兩步進行:

  • 創建所需長度的字符串,例如:%2s。沒有ARGS的printf只打印了所需的長度例如填充空間:2
  • ,但我們有一個變量var,因此%${var}s
  • 替換字符串中的所有空間與.

,但不使用此解決方案。它太慢了,這裏有更好的實用程序,最好的是imho grep

file="/usr/share/dict/words" 
var=5 

grep -P "^\w{$var}$" "$file" 
+0

+1正則表達式的bash腳本,但你能解釋一下正則表達式變量 str = $(printf「%$ {var} s」) - >爲什麼s終於有了? re =「^ $ {str // /.}$」 - >這裏有多少個空格給1或2? – Kshitij8097

+0

@ Kshitij8097補充說明 – jm666

0

GNU AWK和mawk至少(由於空FS):

$ awk -F '' 'NF==2' /usr/share/dict/words     #| head -5 
aa 
Ab 
ad 
ae 
Ah 

FS每個字符分隔自身字段,以便NF告訴記錄長度。

相關問題