簡體   English   中英

帶引號的Perl命令行正則表達式

[英]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。 從命令行!

我可以使用腳本來管理它,但想從命令行中了解如何進行操作。 一定有一個簡單的方法!

我一直在嘗試顯而易見的解決方案,例如:

  1. perl -ne 'if (/Possible/ or /Mismatch/) {/'(\\S+)'/ ;print "$1\\n";}' *.log

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM