2013-09-27 9 views
5
aaa aaaa aaaa aaaa 
sss ssss ssss ssss 
ddd dddd dddd dddd 
fff ffff ffff ffff 
abc pattern asd fde 
111 222 333 444 555 
666 777 888 999 000 

所望の出力を含むパターンの前にすべてのものを削除します。パターン使用のawkやsedの

111 222 333 444 555 
666 777 888 999 000 
+2

を考えると、あなたがファイルから削除したいのかという点ではなく、ファイルから選択するために、何をしたいの面で問題を特定しないようにしてください - それは頻繁になりますあなたとあなたの問題に出くわすソリューションの可読性、保守性などの違い。 –

答えて

10

ちょうどパターンが発見されるたびにフラグを設定した場合。その瞬間から、印刷ライン、上:

$ awk 'p; /pattern/ {p=1}' file 
111 222 333 444 555 
666 777 888 999 000 

、あるいはまた

awk '/pattern/ {p=1;next}p' file 

これは、各行にpatternを探します。変数が見つかると、変数pは1に設定されます。トリッキーな点は、p>0のときに行が印刷されるだけなので、次の行が出力されることです。

How to select lines between two patterns?の場合は、そのような第2パターンがない場合です。

+1

'next'を保存することができました...' awk 'p;/pattern/{p = 1}';) – Kent

+0

あなたの元の答えは読んで理解しやすくなります。特にスクリプトが長い場合は特にそうです。 – Kent

+0

awk 'p;/pattern/{p = 1} 'ファイル –

8
sed '1,/pattern/d' file 

があなたの例として機能します。

sed '0,/pattern/d' file 

より信頼性が高い。

+2

はい。最初の行に 'pattern'が見つからない限り。範囲を0から始める方が良い。 – Birei

+0

@Birei素敵な提案。 ! – Kent

+0

パターンがまったく見つからない場合、これはすべてを削除します。 –

2

もう1つのsed解決策:

sed ':loop;/pattern/{d};N;b loop' file.txt 
+0

これは、パターンが見つからないときにすべてを削除しない唯一の解決策であるようです。 –

関連する問題