web-dev-qa-db-ja.com

テキストが見つかったらファイルから複数の行を削除します

sedまたはgrepで1行を削除する複数の回答を見てきましたが、行を検索し、その行を削除し、さらに2行を削除する必要があります。たとえば、ファイル~/.profileには次のような行があります。

#Set environment variable
export NAME=value
# (blank line here)

したがって、#Set environment variableを検索して削除し、次の行export NAME=variable(コンテンツは関係ありません)、および次の空白行を削除します。 export変数名は動的ですが、コメントは常に同じです。上記のコメントがなくても、削除したくない他のexport変数がある可能性があります。

どうすればこれを達成できますか?

4
Chris G

GNU sedの新しいバージョン(Ubuntuに付属)を使用すると、文字通り改行を一致させることができます。

sed -z 's/#Set environment variable\nexport [^\n]\+\n\n//g' file.txt
  • -zオプションは、入力ファイルの行を改行ではなくASCII NULで終了するものとして扱います。したがって、\nを使用して新しい行を一致させることができます。

  • #Set environment variable\nは、最初の行と一致します(改行を含む)

  • export [^\n]\+\nは、exportで始まる2行目に一致します

  • 3行目は空白なので、\nは単に

  • 次に、空白と一致したパターン全体を置き換えて、目的の部分を保持します

変更したコンテンツでファイルを上書きする場合:

sed -zi.bak 's/#Set environment variable\nexport [^\n]\+\n\n//g' file.txt

元のファイルはfile.txt.bakとして保持されますが、sed -ziだけを使用したくない場合は。

テストは次のとおりです。

$ cat file.txt 
#Set environment variable
export NAME=value
#some text

#Set environment variable
export NAME=value

check
value

export some=value

#Set environment variable
export NAME=value

foo bar



$ sed -z 's/#Set environment variable\nexport [^\n]\+\n\n//g' file.txt 
#Set environment variable
export NAME=value
#some text

check
value

export some=value

foo bar
4
heemayl

標準のsedのdeleteコマンドを使用してこれを行うのは非常に簡単です。

cp ~/.profile ~/.profile.bak
sed '/#Set environment variable/,+2 d' <~/.profile.bak >~/.profile

〜/ .profileに注意してください

2
ludvik02

あなたの質問は、あなたがこれを行うコマンドラインの方法を探しているように見えますが、私があなたの状況にいて、1つまたは2つのファイルに対してのみこれをしたい場合は、emacsを使用します。

emacsには、キーストロークのシーケンスを学習し、必要に応じて何度でも繰り返す機能があります。したがって、あなたの場合、~/.profileemacsで開いてから、

C-x ( C-s #Set environment variable C-a C-k C-k C-k C-x )

[つまり、これを行う:Cx(「学習を開始」を意味します。Csは「検索」を意味します。したがって、#Set環境変数を検索し、Caは「行の先頭に戻り、 3つのCkは「この行を削除する」ことを意味し、最後にCx)は「これを学ぶのをやめる」ことを意味します。]

これらのコマンドを1回入力すると、emacsは3行を削除しましたが、暗記する方法も学習したので、次のように入力できます。

C-x e

そして、それは再びそれを行います、または

C-u 100 C-x e

そして、100回実行します(または、「#Set環境変数」でそれ以上行が見つからない場合は停止します)。

Emacsを使用する利点は、編集が「ライブ」で行われていることを確認できることです。また、1つのsedタイプミスで削除したくないものを大量に削除できるのではないかと心配する私のような妄想的な人にとっては、 emacsで問題が発生した瞬間に、後戻りしてC-_]で修正できます。

0
Yannick