1

次の内容のファイルがあります。

[A hi] [B hello]
[A how] [A why] [C some where]

基本的に、マーカー「A」で「テキスト」を抽出したい

hi
how
why

別の行の新しいファイルに。使ってみsedましたが、正規表現を取得できませんでした。誰かが私に何を使うことができるか教えてもらえますか?

4

3 に答える 3

1

を使用してこれを試してください:

grep -oP '\[A\s+\K[^\]]+' file.txt > new_file.txt

また

grep -oP '\[A\s+\K[^\]]+' file.txt | tee new_file.txt

結果

hi
how
why

説明

  • -ofor grep は「一致する部分のみを取得する」の略です
  • -Pgrep は「Perl 拡張正規表現」の略です
  • \K正規表現のトリックについては、正規表現での \K のサポートを参照してください(これは高度なルックアラウンド正規表現のトリックです)。

コメント付きのの同じ正規表現:

use strict; use warnings;
use feature qw/say/;

while (<>) {
    say for 
        /           # starting regex
            \[A     # a literal "[" and "A"
            \s+     # at least one whitespace (\n, \r, \t, \f, and " ")
            \K      # restart the match
            [^\]]+  # at least one character that is not a literal "]"
        /gsx;       # end of the regex and the modifiers
}

リンク

正規表現については、次を参照してください。

于 2013-01-26T16:07:09.950 に答える
0

これはあなたのために働くかもしれません(GNU sed):

sed -r '/\[A\s+([^]]*)\]/{s//\n\1\n/;s/[^\n]*\n//;P};D' file
于 2013-01-26T22:15:31.707 に答える
0

sed でこれを行う方法はわかりませんが (あまり詳しくありません)、Perl 互換の正規表現で GNU grep を使用できます (別の例については、この回答を参照してください)。

テスト入力用にまとめた簡単な正規表現を次に示します (データが「foo」という名前のファイルにあると仮定します)。

cat foo | grep -Po '(?<=\[A )[^\]]+'

これは以下を出力します:

hi
how
why

更新- これがどのように機能するか:

正規表現の最初の部分は(?<=\[A )否定後読みを使用します。これは基本的に、探していると思うものの前に何か (この場合は\[A) があることを確認することを意味します。これは、探しているものにコンテキストを与えるのに役立ちます。これはキャプチャ グループでも実現できますが、この種のことを grep で行ったことがないため、ここでそれらを使用する方法がわかりませんでした。後読みの 1 つの構文は次のとおりです(?<=THING_TO_PRECEDE_YOUR_MATCH_WITH)

2番目のチャンク[^\]]+は、「ではない1つ以上の文字を見つけて\]ください。角括弧は正規表現で何かを意味するため、エスケープする必要があることに注意してください。 [^CHARSET]特定の文字セットまたは文字クラス以外は何でも+言います。今述べたものの1つ以上。

正規表現の経験によっては、これが役に立った場合と役に立たなかった場合があります。より適切に説明できる点があれば教えてください。これらを学ぶのに最適な場所がわかりません。Python をよく使ってきたので、Python の構文リファレンスは非常に便利だと思います。また、Google はhttp://www.regular-expressions.info/を指し示す傾向がありますが、経験上、それがどれほど役立つかはわかりません。

于 2013-01-26T15:53:23.263 に答える