我試圖使用grep的-P選項在命令列進行過濾,這應該是使用perl的regex
ls | grep -P ZZZZZTYT.vcf.gz 作業
但是
ls | grep -P ZZZZZTYT.vcf.gz$
不起作用。 看來錨點在GNU grep 3.4的grep -P中不起作用。
這些例子當然是微不足道的。
我也試過用單行線來過濾,就像perl單行線如grep?
ls | perl -ne 'print 1 if not $_ =~ m/.gz$/'
但這也沒有用。
ls | perl -ne 'print 1 if not /.gz$/'
我的猜測是,最好的賭注是perl單行代碼。
我怎樣才能重寫上面的單行代碼,以便在檔案串列上進行grep呢?
uj5u.com熱心網友回復:
盡管你的例子中有一些問題,但我無法重現你的問題。
對于ls | grep -P ZZZZZTYT.vcf.gz可以作業,而ls | grep -P ZZZZZTYT.vcf.gz$不可以,我的第一個猜測是你的檔案末尾有空格或其他 "看不見 "的字符。你可以試試ls | cat -A(或cat -veT),看看是否真的有比你能看到的更多的字符。總之,你的 regex 可以用字面的點(.)寫得更好,因為.單獨匹配任何東西。
在你的 perl onliners 中,你試圖列印 $1 而這個變數是空的,從 perldoc perlvar:
$<digits> ($1, $2, ...)
包含了從相應的捕獲集的子模式
小括號中的子圖案,最后一個成功的圖案匹配,不算作
在已經退出的嵌套塊中匹配的模式。
這些變數是只讀的和動態范圍的。
記憶法:如數字。
我認為你想列印$_,當你使用-n開關(在perlvar和perlfunc中的參考)時,這個變數保存當前行的內容。然后你可以把你的perl oneliner改寫成:
ls | perl -ne'/.gz$/ or print' # for not . gz files
或者
ls | perl -ne'/.gz$/ and print'/span> # list .gz files
使用你的例子,從網上洗掉$1就可以了。
正如已經指出的,你需要檢查你的檔案名末尾是否有東西。
如果你的檔案名末尾有 "壞字符",這個oneliner將適用于列出.gz檔案:
ls | perl -ne'/.gz.*$/ and print'/span>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311326.html
標籤:
