正規表現に一致するファイルの最初の行以降の部分を取得する方法 質問する

正規表現に一致するファイルの最初の行以降の部分を取得する方法 質問する

約 1000 行のファイルがあります。grep ステートメントに一致する行の後のファイル部分を取得したいです。

あれは:

cat file | grep 'TERMINATE'     # It is found on line 534

したがって、さらに処理するには、535 行目から 1000 行目までのファイルが必要です。

どうやってやるの?

ベストアンサー1

TERMINATE次のようにすると、ファイルの最後まで一致する行が出力されます。

sed -n -e '/TERMINATE/,$p'

説明: -nsedは、スクリプトを実行した後に各行を印刷する のデフォルトの動作を無効にします。は、-eへのスクリプトを示しsed/TERMINATE/,$アドレス (行) 範囲の選択であり、正規表現 (grep など) に一致する最初の行TERMINATEからファイルの末尾 ( $) までを意味し、 はp現在の行を印刷する印刷コマンドです。

これは、一致する行の次の行からTERMINATEファイルの最後までを印刷します: (一致する行の AFTER から EOF まで、一致する行は含みません)

sed -e '1,/TERMINATE/d'

説明: 1,/TERMINATE/は、入力の最初の行から正規TERMINATE表現に一致する最初の行までのアドレス (行) 範囲選択であり、d現在の行を削除して次の行にスキップする削除コマンドです。デフォルトの動作は行を印刷することであるため、入力の最後までsedの行が印刷されます。TERMINATE

前の行が必要な場合TERMINATE:

sed -e '/TERMINATE/,$d'

2 つの異なるファイルの前後の両方の行をTERMINATE1 回のパスで取得したい場合は、次のようにします。

sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file

前後のファイルには終了行が含まれるため、それぞれを処理するには以下を使用する必要があります。

head -n -1 before
tail -n +2 after

sed スクリプトでファイル名をハードコードしたくない場合は、次の操作を実行できます。

before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file

ただし、$最後の行で意味をエスケープして、シェルが変数を展開しないようにする必要があります$w(スクリプトの周囲に一重引用符ではなく二重引用符を使用していることに注意してください)。

スクリプト内のファイル名の後の改行は、sed がファイル名の終了を認識するために重要であることをお伝えするのを忘れました。

TERMINATEハードコードされたものを変数に置き換えるにはどうすればよいでしょうか?

一致するテキストの変数を作成し、前の例と同じ方法で実行します。

matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file

前の例と一致するテキストに変数を使用するには:

## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"

このような場合にテキストを変数に置き換える際の重要なポイントは次のとおりです。

  1. [ ] で囲まれた変数 ( $variablename) は「展開」されませんが、[ ] 内の変数は展開されます。したがって、変数に置き換えたいテキストが含まれている場合は、すべてを に変更する必要があります。single quotes'double quotes"single quotesdouble quotes
  2. 範囲sedには も含まれており、その直後には、、$のような文字が続きます。これらは展開される変数のようにも見えるため、 、、のようにバックスラッシュ [ ]を使用してこれらの文字をエスケープする必要があります。$p$d$w$\\$p\$d\$w

おすすめ記事