我想突出顯示每一個出現的匹配詞,使用下面的awk命令,
。輸入:
The Zen of Python, by Tim Peters
美麗的比丑陋的好。
明確的比隱含的好。
簡單的比復雜的好。
復雜的比復雜的好。
扁平的比嵌套的好。
稀疏的比密集的好。
可讀性很重要。
特殊情況并不特別,不足以打破規則。
盡管實用性勝過純潔性。
錯誤不應該無聲地通過。
除非明確的沉默。
面對模棱兩可的問題,拒絕猜測的誘惑。
應該有一個--最好是只有一個--明顯的方法來做。
盡管這個方法一開始可能并不明顯,除非你是荷蘭人。
現在做總比不做好。
盡管永遠不做往往比*現在做要好。
如果實施是難以解釋的,那就是一個壞主意。
如果實作很容易解釋,它可能是一個好主意。
命名空間是一個偉大的想法 -- 讓我們做更多這樣的事情吧
命令:
python -c "import this | awk -v t="better" ' { gsub(t," "&-" a["&" ] "] ,$0); print }
但是,看起來gsub()沒有正確作業。輸入共有8個--"更好 "的匹配,但對于最后一個匹配,上述命令列印出 "更好-18"。 如何解決這個問題。
雖然從來都是[better-18]比*right*現在好。# 錯誤的應該是8
預期輸出:
美麗的比丑陋的[更好-1]。
明確的比隱含的[更好-2]。
簡單的比復雜的[更好-3]。
復雜的比復雜的[更好-4]。
扁平的比嵌套的[更好-5]。
稀疏的比密集的[好-6]。
可讀性也很重要。
特殊情況并不特別,不足以打破規則。
盡管實用性勝過純粹性。
錯誤不應該無聲地通過。
除非明確的沉默。
面對模棱兩可的問題,拒絕猜測的誘惑。
應該有一個--最好是只有一個--明顯的方法來做。
盡管這個方法起初可能并不明顯,除非你是荷蘭人。
現在是[更好的7],而不是永遠。
盡管從來沒有比*現在更好。
如果實施是難以解釋的,那就是一個壞主意。
如果實作很容易解釋,它可能是一個好主意。
命名空間是一個偉大的想法 -- 讓我們做更多這樣的事情吧
我希望有一個可擴展的解決方案,可以容納更多的詞,即來自另一個文本檔案的輸入,只需對輸入檔案進行一次掃描。這個 "詞 "應該是完全匹配的,而不是部分/子串。
match.txt
更好的
理念
uj5u.com熱心網友回復:
你不能這樣做:
gsub(t," [" "&-" a["&"] "] " ,$0)
因為它將做一個部分的regexp匹配,而不是一個完整的字串匹配,更重要的是,在呼叫gsub()之前,gsub()的引數被評估,所以 a["&"]是在呼叫gsub()之前增加了由字面單字符字串"&"索引的a[]的價值。這和你寫的是完全一樣的:
foo=( a["&"]); gsub(t," [" "&-" foo "] " ,$0)
這可能是你想做的,使用GNU awk來實作patsplit():
$ cat tst.awk
NR==FNR {
words[$1]
下一個
}
{
n = patsplit($0,flds,/[[:alnum:]_] /,seps)
out = seps[0]
for (i=1; i<=n; i ) {
word = flds[i]
if ( word in words ) {
word = "[" word "-" ( cnt[word]) "]"
}
out = out word seps[i]
}
print out
}
$ awk -f tst.awk match.txt file
Python之禪,作者:Tim Peters
美麗的比丑陋的[更好-1]。
明確的比隱含的[更好-2]。
簡單比復雜[更好-3]。
復雜的比復雜的[更好-4]。
扁平的比嵌套的[更好-5]。
稀疏的比密集的[好-6]。
可讀性也很重要。
特殊情況并不特別,不足以打破規則。
盡管實用性勝過純粹性。
錯誤不應該無聲地通過。
除非明確的沉默。
面對模棱兩可的問題,拒絕猜測的誘惑。
應該有一個--最好是只有一個--明顯的方法來做。
盡管這個方法起初可能并不明顯,除非你是荷蘭人。
現在是[更好的7],而不是永遠。
盡管永遠不會比*現在更好8。
如果實施起來很難解釋,那就是一個糟糕的[想法-1]。
如果實作是容易解釋的,它可能是一個好的[想法-2]。
命名空間是一個偉大的[想法-3] --讓我們做更多這樣的事情吧
以上假設你對 "詞 "的定義是任何字母數字或下劃線(即 "詞成分")字符的序列--如果不是,那么只需將[[:alnum:]_] 改為符合你對 "詞 "定義的任何內容。
你可以在任何POSIX awk中用while (match(...,/[:alnum:]_] /)) substr(... 回圈來做同樣的事情--如果你想這樣做的話,請留下一個練習。
如果你想處理作為變數賦值的1個字,那么:
$ cat tst.awk
{
n = patsplit($0,flds,/[[:alnum:]_] /,seps)
out = seps[0]
for (i=1; i<=n; i ) {
word = flds[i]
if ( word == t ) {
word = "[" word "-" ( cnt) " ]"
}
out = out word seps[i]
}
print out
}
$ awk -v t='better' -f tst.awk file
Python的禪,作者Tim Peters
美麗的比丑陋的[更好-1]。
明確的比隱含的[更好-2]。
簡單比復雜[更好-3]。
復雜的比復雜的[更好-4]。
扁平的比嵌套的[更好-5]。
稀疏的比密集的[好-6]。
可讀性也很重要。
特殊情況并不特別,不足以打破規則。
盡管實用性勝過純粹性。
錯誤不應該無聲地通過。
除非明確的沉默。
面對模棱兩可的問題,拒絕猜測的誘惑。
應該有一個--最好是只有一個--明顯的方法來做。
盡管這個方法起初可能并不明顯,除非你是荷蘭人。
現在是[更好的7],而不是永遠。
盡管從來沒有比*現在更好。
如果實施是難以解釋的,那就是一個壞主意。
如果實作很容易解釋,它可能是一個好主意。
命名空間是一個偉大的想法 -- 讓我們做更多這樣的事情吧
uj5u.com熱心網友回復:
對于多個匹配詞,也可以使用Perl
。$ perl -pe ' BEGIN { @m= map {chomp;$_} qx(cat match.txt); $t=join("|",@m) };
s/$t/$kv{$&} ;"[$&-$kv{$&}]"/ge ' input.txt
Python之禪,作者:Tim Peters
美麗的比丑陋的[更好-1]。
明確的比隱含的[更好-2]。
簡單比復雜[更好-3]。
復雜的比復雜的[更好-4]。
扁平的比嵌套的[更好-5]。
稀疏的比密集的[好-6]。
可讀性也很重要。
特殊情況并不特別,不足以打破規則。
盡管實用性勝過純粹性。
錯誤不應該無聲地通過。
除非明確的沉默。
面對模棱兩可的問題,拒絕猜測的誘惑。
應該有一個--最好是只有一個--明顯的方法來做。
盡管這個方法起初可能并不明顯,除非你是荷蘭人。
現在是[更好的7],而不是永遠。
盡管永遠不會比*現在更好8。
如果實施起來很難解釋,那就是一個糟糕的[想法-1]。
如果實作是容易解釋的,它可能是一個好的[想法-2]。
命名空間是一個偉大的[想法-3] --讓我們做更多這樣的事情吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318120.html
標籤:
