我創造了這個基本的腳本:如何根據給定數量的字母顯示單詞?
#!/bin/bash
file="/usr/share/dict/words"
var=2
sed -n "/^$var$/p" /usr/share/dict/words
然而,由於要求是它不工作(或者還需要一些更多的邏輯,把它)。
這裏,應該只打印2個字母的單詞,但這個被賦予不同的輸出
任何人都可以提出關於如何使用sed或awk來實現這個想法?
我創造了這個基本的腳本:如何根據給定數量的字母顯示單詞?
#!/bin/bash
file="/usr/share/dict/words"
var=2
sed -n "/^$var$/p" /usr/share/dict/words
然而,由於要求是它不工作(或者還需要一些更多的邏輯,把它)。
這裏,應該只打印2個字母的單詞,但這個被賦予不同的輸出
任何人都可以提出關於如何使用sed或awk來實現這個想法?
你所執行的是:
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'。 FWIW我總是嘗試儘可能地本地化shell變量擴展,例如'sed -n'/^.\{'"$ var''\} $/p'',以避免在shell解釋腳本的其餘部分時出現任何意外。 –
@EdMorton謝謝!在這種情況下會發生什麼?我的意思是,在哪些情況下我的方法會出現意想不到的行爲? – fedorqui
你的腳本會很好,但通常情況下最好是防止問題發生。就像引用shell變量一樣 - 在許多情況下,它並不重要,但最好是在那些時候採取這種做法的習慣。 –
應該只打印2個字母的單詞
你sed
命令只搜索與文本2
行。
您可以使用awk
此:
awk 'length() == 2' file
或使用shell變量:
awk -v n=$var 'length() == n' file
awk長度函數很棒 – Kshitij8097
默認長度爲'$ 0',所以也可以使用'awk'長度== n'' – Sundeep
非常好的一點@Sundeep。我忘了這個,現在編輯它。 – anubhava
嘗試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
它具有相同的效果。
只輸出匹配2個字母字符使用grep行:
grep '^[[:alpha:]]\{2\}$' /usr/share/dict/words
純的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"
+1正則表達式的bash腳本,但你能解釋一下正則表達式變量 str = $(printf「%$ {var} s」) - >爲什麼s終於有了? re =「^ $ {str // /.}$」 - >這裏有多少個空格給1或2? – Kshitij8097
@ Kshitij8097補充說明 – jm666
GNU AWK和mawk至少(由於空FS
):
$ awk -F '' 'NF==2' /usr/share/dict/words #| head -5
aa
Ab
ad
ae
Ah
空FS
每個字符分隔自身字段,以便NF
告訴記錄長度。
順便說一下,'$ file'變量在這裏看起來沒用,因爲你以後不會在'sed'調用中使用它。 – fedorqui