1

このタイプの行を含むいくつかの 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 オプションを使用して /'/ で分割しようとしたところ、同じエラーが発生しました。

コマンドライン内の ' をエスケープするにはどうすればよいですか?

4

4 に答える 4

1

bash が単一引用符を評価しているので、単純に 3 つの文字列を作成しました。最初の文字列は で終わり、/エスケープされた単一引用符を 1 つ追加して、最後の部分を続けます。このようにして、文字列は bash によって接着され、Perl は正しい入力を取得します。

perl -ne 'if (/Possible/ or /Mismatch/) {/'\''(\S+)'\''/ ;print "$1\n";}' *.txt
于 2015-03-12T10:24:56.797 に答える
1

スクリプト引数のすべてまたは一部に二重引用符を使用すると問題が発生することがわかりました。特に、スクリプトに a$または aを含める必要がある場合はそうです!

もう 1 つのアプローチは、一重引用符文字が ASCII/Unicode チャートのコード ポイント番号 27 (16 進数) にあるという事実を利用することです。\x27Perl 文字列または正規表現では、またはとして参照できます\x{27}

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

名前付き変数を使用して物事を明確にすることもできますが、それはおそらくワンライナーにはやり過ぎです:

perl -ne 'BEGIN { $apos = "\x27" } if (/Possible/ or /Mismatch/) {/$apos(\S+)$apos/ ;print "$1\n";}' *.log
于 2015-03-12T20:42:40.090 に答える
1

コードを二重引用符で囲みます。コードで発生した場合"は、その部分を一重引用符で囲んでください。

$ 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
于 2015-03-12T10:18:59.060 に答える