数行のテキストで構成されるファイルがあります。
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
しかし、文字列の行番号を見つける方法は?または、他にどのようにすればよいですか?
一致した行(または次の行)を印刷したくない場合:
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 を参照してください。
これは、他の特定のソリューションよりも少し短いです。大文字のQを使用して終了すると、現在の行が印刷されなくなります。
sed '/The second line/Q' file
実際に行を削除するには、同じ構文を使用できます。
sed -i '/The second line/Q' file
sed '/The second line/q0' file
または、gnusなしで:
sed '/The second line/q' file
または、grepを使用して:
grep -B 9999999 "The second line"
Awkを使用する(一致した行を表示しない)
awk '/pattern/ {exit} {print}' file.txt
最初に行番号を追加して、行を削除します
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
awk '/The second line/{exit}1' file