我有這個文本檔案,我想排除“訪問”這個詞,因為 a 在第二、第三或第四位置后面跟著 a、b 或 c。
# cat tt.txt
access
ample
taxing
我試過這個,但它回傳所有 3 個單詞。
# grep '[a-c][^a-c][^a-c][^a-c]' tt.txt
access
ample
taxing
更新1:
我在上面使用了過度簡化的示例。
# cat tt.txt
access
bccess
ample
taxing
tacking
not
# grep -Ev '[a-c].{0,2}[a-c]' tt.txt
ample
taxing
not
# grep -E '[a-c].{0,2}[^a-c]' tt.txt
access
bccess
ample
taxing
tacking
# Expected
ample
taxing
uj5u.com熱心網友回復:
我想排除這個詞
access,因為a后面跟著a,b或c在第二、第三或第四位置
可以使用這個來完成awk:
awk '/[a-c]/ && !/[a-c].{0,2}[a-c]/' file
ample
taxing
正則運算式細分:
[a-c]:匹配a或b或c.{0,2}: 匹配 0 到 2 個任意字符[a-c]:匹配a或b或c
或者使用環顧四周gnu-grep:
grep -P '^(?=.*[a-c])(?!.*[a-c].{0,2}[a-c])' file
ample
taxing
相同的解決方案perl:
perl -ne 'print if /[a-c]/ && !/[a-c].{0,2}[a-c]/' file
uj5u.com熱心網友回復:
據我所知,您的情況是:
- 字串必須包含或
a之一。bc - 在 pos 0-3 中,沒有 abc 可以在另一個 abc 之前。
那么,我們為什么不直接撰寫這樣的代碼。
use strict;
use warnings;
while (<DATA>) {
next unless /[a-c]/; # skip if no abc
next if substr($_, 0, 4) =~ /(?<=[a-c])[a-c]/; # skip if an abc is preceded by an abc
print; # otherwise print
}
__DATA__
access
bccess
ample
taxing
tacking
not
這是一種撰寫模擬菱形運算子的代碼的方法<>,由Perl oneliners 中常用的-n和開關使用。-p我們使用 DATA 檔案句柄來模擬檔案。如果你想把它變成一個單線器,它看起來像
$ perl -ne' next unless /[a-c]/; next if substr($_, 0, 4) =~ /(?<=[a-c])[a-c]/; print; ' file.txt
我已經在您的示例單詞串列上對其進行了測驗,它似乎按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521580.html
標籤:perl
上一篇:從包中匯出匿名函式
下一篇:在perl中使用變數呼叫sed
