一意でない2つのパターン間の線を抽出するには?
例:-
data of type samplex
name a
property b
data of type samplex
name c
property d
data of type samplex
name e
property f
data of type sampley
name g
property h
「sampex型のデータ」スキーマを検索し、その間に発生するすべての行を取得したいと思います。
First occurrence:-
name a
property b
Second occurrence:-
name c
property d
Third occurrence:-
name e
property f
最初の発生のみを取得し、2つのモードが異なる場合、
sed '/pattern1/,/pattern2/p;/pattern2/q' <file> will work.
必要に応じてこのコマンドをどのように調整できますか?
答え1
sed 's:data of type samplex:\n:g' File_name -i
このコードはその文字列を改行で置き換えるため、必要な情報を取得できます。-i
ソースファイルの変更のみを保存するには、このオプションを使用してください。
答え2
これはあなたに効果がありますか?
grep "data of type samplex" -A 2 <file>
答え3
あなたが望むものについての私の間違った解釈に基づいて...明らかに全体のフレーズより少なく一致することができればそれを減らすことができます。
sed -n '/data\ of\ type\ samplex/,/data\ of\ type\ sampley/{s/data\ of\ type\ sample[xy]//; p}' file
-n
[xy]
静かに、出力がxまたはyと一致するようになるまで何も印刷しないで
s/data\ of\ type\ sample[xy]//
ください
p
。
出力:
name a
property b
name c
property d
name e
property f
必要な場合に備えて、「N番目の発生:-」増分を追加する方法が見つかりませんでした。
答え4
仮定:
- 入力ファイルには、次の
data of type
キーワード区切りが続くさまざまなセクションがあります。samplex
sampley
- 抽出が必要:特定のセクションに属するすべてのテキスト
コーナーケースを反映するために、入力ファイルが少し修正されました。
$ cat ip.txt
data of type samplex
name a
property b
data of type samplez
name 1
property 2
data of type samplex
name e
property f
data of type sampley
name g
property h
data of type samplex
name c
property d
以下の解決策では、部分が一致した場合に$match
設定され、それ以外の場合はアクションが入力されます。その後、次のセクションが始まるまで入力ラインが印刷されます。これにより、ファイルの末尾の部分も処理されます。1
0
data of type
$ perl -ne 'if(/data of type /){$match=/samplex$/} elsif($match){print}' ip.txt
name a
property b
name e
property f
name c
property d
$ perl -ne 'if(/data of type /){$match=/samplez$/} elsif($match){print}' ip.txt
name 1
property 2
$ perl -ne 'if(/data of type /){$match=/sampley$/} elsif($match){print}' ip.txt
name g
property h