web-dev-qa-db-ja.com

一致する行の後から始まるファイル内のすべての行を削除するにはどうすればよいですか?

数行のテキストで構成されるファイルがあります。

The first line
The second line
The third line
The fourth line

次の行の1つである文字列があります:The second line

ファイル内の文字列とその後のすべての行を削除したいので、The third lineおよびThe fourth lineに加えて、文字列。ファイルは次のようになります。

The first line

Googleでソリューションを検索しましたが、sedを使用する必要があるようです。何かのようなもの:

sed 'linenum,$d' file

しかし、文字列の行番号を見つける方法は?または、他にどのようにすればよいですか?

71
DocWiki

一致した行(または次の行)を印刷したくない場合:

sed -n '/The second line/q;p' inputfile

これは、「パターンに一致する行に到達すると終了するか、それ以外の場合は各行を印刷する」と表示されます。 -nオプションは暗黙的な印刷を防ぎ、行を明示的に印刷するにはpコマンドが必要です。

または

sed '/The second line/,$d' inputfile

これは、「一致した行から始まり、ファイルの最後まで続く出力からすべての行を削除する」と言います。

しかし、最初の方が高速です。ただし、引数として複数のファイルがある場合、最初に一致したファイルの後のファイルは処理されないため、処理は完全に終了します。この場合、削除フォームの方が優れています。

一致した行を印刷したいが、次の行は印刷しない場合:

sed '/The second line/q' inputfile

これは、「すべての行を出力し、一致した行に到達したら終了する」(-nオプション(暗黙的な印刷なし)は使用されません)。

追加情報については man sed を参照してください。

109

これは、他の特定のソリューションよりも少し短いです。大文字のQを使用して終了すると、現在の行が印刷されなくなります。

 sed '/The second line/Q' file

実際に行を削除するには、同じ構文を使用できます。

 sed -i '/The second line/Q' file
22
jaap
sed '/The second line/q0' file

または、gnusなしで:

sed '/The second line/q' file

または、grepを使用して:

grep -B 9999999 "The second line"
5
Erik

Awkを使用する(一致した行を表示しない)

awk '/pattern/ {exit} {print}' file.txt
4
Joel Arnold

最初に行番号を追加して、行を削除します

cat new.txt 
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

awkを使用して

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line
0
sush
awk '/The second line/{exit}1' file
0
kurumi