2つのパターン間(および含む)の行を印刷します


16

CKの末尾にある行からgrepを開始し、行の末尾にあるときにgrepを停止しDます。試しましたgrep "$CK" "$D" file..txtが、うまくいきませんでした。

入力:

kkkkkkkkkkk   
jjjjjjjjjjjjjjjjjj  
gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D  
GGGGGGGGGGGGGG  
GGGGGGGGGGGGGG

目的の出力:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

回答:


21

またはを使用したほうが良い

awk '/CK$/,/D$/' file.txt

または

sed -n '/CK$/,/D$/p' file.txt

あなたがを主張するなら、ここにGNU grepの方法があります

grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt

ここに

-P perl-regexpを有効にします

-z行区切り文字をNULに設定します。これにより、grepはファイル全体を1行として認識します。

-o 一致のみを印刷します

(?s)PCRE_DOTALLをアクティブにし、.任意の文字または改行を見つけます

\N 改行以外のものに一致します

.*?見つけます。貪欲でないモードで

(?<=..) 後読みのアサーションです

(?=..) 先読みアサーションです


なぜスラッシュを追加しないのですか?このようにawk '/\/CK/,/\/D/' input
ラーフルパティル

@ RahulPatil、OPが「行の末尾に「CK」を持つ行からgrepを開始し、行に「D」がある場合にgrepを停止する」と述べているためです
-iruvar

あなたがPCREのgrepの最後の説明してください可能性があり、私は、あなたが正規表現の強力な理解を持っている..私はそのレベルを理解していなかったようだ
ラーフルパティル

@RahulPatil、いくつかの説明を追加:-)
iruvar

@RohitPatil、一致する選択をファイルから削除したい。それをしてもいいですか?
ラナ・カーン

0

BSDを使用している場合grep(perl regex paramをサポートしていない場合-P)、次の回避策があります。

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

これは、すべての行を連結し(新しい行を_文字で置き換え)、1行のパターンを確認し、元の状態に戻すように行を展開することで機能します。

GNUを使用している場合grep、で複数行一致を実現できますが、別の回答で述べたようgrepgrep-P)にperl-regexpを使用する必要があります。それでも、macOSにGNU をインストールして、代わりに使用できます。grepbrew install grepggrep


またはpcregrep、複数行パターンをサポートするを使用できます(-M)。


ex次のコマンドも使用できます。

ex +"/aaa/;/cdn/p" -scq! file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.