[英]Perl command line regex with quotation mark
我有許多txt(* .log)文件,其中包含以下類型的行:
...
不匹配的“ 9:132170673”:f [G,T] = [0.32,0.68]
不匹配的“ 9:132228706”:f [C,T] = [0.27,0.73]
'9:132280822'的可能的股翻轉:f [C,G,T] = [0.16,0.00,0.84]
...
我正在嘗試提取引號之間的字符串number:number。 從命令行!
我可以使用腳本來管理它,但想從命令行中了解如何進行操作。 一定有一個簡單的方法!
我一直在嘗試顯而易見的解決方案,例如:
perl -ne 'if (/Possible/ or /Mismatch/) {/'(\\S+)'/ ;print "$1\\n";}' *.log
perl -ne 'if (/Possible/ or /Mismatch/) {/\\'(\\S+)\\'/ ;print "$1\\n";}' *.log
兩者都從UNIX獲得以下答案:
-bash:意外令牌'('附近的語法錯誤
我還嘗試使用-F選項在/'/上拆分,得到相同的錯誤。
如何在命令行中轉義'?
將您的代碼放在雙引號中。 如果您的代碼中出現"
,則僅將該部分放在單引號內。
$ perl -ne "if (m/Possible|Mismatch/) {/'(\S+)\'/ ;print "'"$1\n";}' file
9:132170673
9:132228706
9:132280822
要么
perl -ne "if(/Possible/ or /Mismatch/) {/'([^']+)'/ ;print "'"$1\n";}' file
當bash評估單引號時,我簡單地用它做成了三個字符串,第一個以/
結束,然后添加一個轉義的單引號並繼續最后一部分。 這樣,通過bash將字符串粘合在一起,Perl將獲得正確的輸入。
perl -ne 'if (/Possible/ or /Mismatch/) {/'\''(\S+)'\''/ ;print "$1\n";}' *.txt
我會做:
perl -nE '/\b(?:Mismatched|Possible)\b.*?'\''(\S+)'\''/ and say $1' in1.txt
輸出:
9:132170673
9:132228706
9:132280822
我發現對腳本參數的全部或部分使用雙引號會出現問題-特別是當您需要包含$
或!
在腳本中。
另一種方法是利用單引號字符位於ASCII / Unicode圖表中的代碼點編號27(hex)的事實。 在Perl字符串或正則表達式中,您可以將其稱為\\x27
或\\x{27}
:
perl -ne 'if (/Possible/ or /Mismatch/) {/\x27(\S+)\x27/ ;print "$1\n";}' *.log
您可以使用命名變量來使情況更清楚,但對於1-liner來說可能會過大:
perl -ne 'BEGIN { $apos = "\x27" } if (/Possible/ or /Mismatch/) {/$apos(\S+)$apos/ ;print "$1\n";}' *.log
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.