次の内容のファイルがあります。
[A hi] [B hello]
[A how] [A why] [C some where]
基本的に、マーカー「A」で「テキスト」を抽出したい
hi
how
why
別の行の新しいファイルに。使ってみsed
ましたが、正規表現を取得できませんでした。誰かが私に何を使うことができるか教えてもらえますか?
grepを使用してこれを試してください:
grep -oP '\[A\s+\K[^\]]+' file.txt > new_file.txt
また
grep -oP '\[A\s+\K[^\]]+' file.txt | tee new_file.txt
hi
how
why
-o
for grep は「一致する部分のみを取得する」の略です-P
grep は「Perl 拡張正規表現」の略です\K
正規表現のトリックについては、正規表現での \K のサポートを参照してください(これは高度なルックアラウンド正規表現のトリックです)。コメント付きのperlの同じ正規表現:
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
}
正規表現については、次を参照してください。
これはあなたのために働くかもしれません(GNU sed):
sed -r '/\[A\s+([^]]*)\]/{s//\n\1\n/;s/[^\n]*\n//;P};D' file
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/を指し示す傾向がありますが、経験上、それがどれほど役立つかはわかりません。