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


84

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

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

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

私はそれが削除されますので、ファイル内の文字列とその後のすべての行を削除するThe third lineThe fourth line、文字列に加えて。ファイルは次のようになります。

The first line

私はグーグルで解決策を探しました、そして私は使うべきであるようsedです。何かのようなもの:

sed 'linenum,$d' file

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


問題の説明は矛盾しています。「行ののすべての行を削除したい」とは、(あなたが言うように)2行だけを削除することを意味しますが、出力例では一致行も欠落していると示されています。あなたは実際にどちらが欲しいですか?
Jonathan Leffler 2011年

一致する行とその後のすべての行。私は英語を上達させなければなりません。情報ありがとうございます。
docWiki 2011年

回答:


136

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

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

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

または

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

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

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

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

sed '/The second line/q' inputfile

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

詳細については、mansedを参照してください。


3
ただし、一部のコマンド(RCSco -pなど)は壊れたパイプに腹を立てるので、sed '/The second line/,$d'表記法を使用したほうがよいでしょう。
Jonathan Leffler 2011年

説明をお願いします。
Ahmad Abdelghany 2017年

@AhmadAbdelghany:説明が追加されました。
追って通知があるまで一時停止します。

@DennisWilliamsonどうもありがとう。
Ahmad Abdelghany 2017年

最初の方法では、一致した行の前の最後の行を2回出力します。p後の;作品を削除します。
CrazyFrog 2017

27

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

 sed '/The second line/Q' file

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

 sed -i '/The second line/Q' file

1
これは私のお気に入りのソリューションです。
TryTryAgain 2016年

5
sed '/The second line/q0' file

または、gnusedなし:

sed '/The second line/q' file

または、grepを使用します。

grep -B 9999999 "The second line"

どうもありがとうございました!まだわからない特定の文字列の行番号を見つける方法を教えてください。
docWiki 2011年

grep -n "2行目"ファイル| awk -F: '{print $ 1}'
Erik

@DocWiki:行番号は必要ありません。あなたはそれを検索します。 sed "/$string/,\$d" inputfile
Jonathan Leffler 2011年


0

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

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

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