sed
またはgrep
で1行を削除する複数の回答を見てきましたが、行を検索し、その行を削除し、さらに2行を削除する必要があります。たとえば、ファイル~/.profile
には次のような行があります。
#Set environment variable
export NAME=value
# (blank line here)
したがって、#Set environment variable
を検索して削除し、次の行export NAME=variable
(コンテンツは関係ありません)、および次の空白行を削除します。 export
変数名は動的ですが、コメントは常に同じです。上記のコメントがなくても、削除したくない他のexport
変数がある可能性があります。
どうすればこれを達成できますか?
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
標準のsedのdeleteコマンドを使用してこれを行うのは非常に簡単です。
cp ~/.profile ~/.profile.bak
sed '/#Set environment variable/,+2 d' <~/.profile.bak >~/.profile
〜/ .profileに注意してください
あなたの質問は、あなたがこれを行うコマンドラインの方法を探しているように見えますが、私があなたの状況にいて、1つまたは2つのファイルに対してのみこれをしたい場合は、emacs
を使用します。
emacs
には、キーストロークのシーケンスを学習し、必要に応じて何度でも繰り返す機能があります。したがって、あなたの場合、~/.profile
をemacs
で開いてから、
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-_
]で修正できます。