web-dev-qa-db-ja.com

sed + 1つのsedコマンドで「#」と空行を削除

1つのsedコマンドでコメント行(#bal blaとして)および空行(文字のない行)をファイルから削除する方法

THXリディア

25
lidia

1つではなく2つのsedプロセスをパイプラインで開始することを心配している場合は、おそらくそうすべきではありません。それ非効率ではありません。

ただし、doで単一のプロセスが必要な場合は、次のように複数の-e引数を使用できます。

sed -e 's/#.*$//' -e '/^$/d' inputFile

whyに関するコメントに応じて、sed -iをインプレース編集に使用する単一のプロセスが必要な場合でも、次のトランスクリプトに従ってそれを行うことができます。

pax> echo 'Line # with a comment' >qq
pax> echo >>qq
pax> echo '# Line with only a comment' >>qq
pax> cat qq
Line # with a comment

# Line with only a comment
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq
pax> cat qq
Line
pax> _

2つの-eオプションを使用しても、ファイルがその場で変更されることに注意してください。両方のコマンドが各行で実行されていることがわかります。コメントのある行では、最初にコメントが削除されてから、空のためすべて削除されます。

さらに、元の空の行も削除されます。

36
paxdiablo

@paxdiabloには良い答えがありますが、改善することができます。

(1)'/^$/d'句は、100%の空白行にのみ一致します。

完全に空白である行(スペース、タブなど)にも一致させたい場合は、代わりにこれを使用します。

'/^\s*$/d'

(2)'s/#.*$//'句は、列0の#文字で始まる行にのみ一致します。

最初の#の前に空白のみがある行も一致させる場合は、代わりにこれを使用します。

'/^\s*#.*$/d'

上記の基準は普遍的ではない可能性があります(たとえば、HEREDOCブロック内、またはPython複数行の文字列では、さまざまなアプローチが重要になる可能性があります)。ただし、多くの場合、従来の「空白」の定義行には空白のみが含まれ、「コメント」行には空白-その後-#が含まれます。

(3)最後に、少なくともOSXでは、最初の句がコメント行を空白行に変換し、2番目の句が空白行(元はコメントであったものも含む)を取り除く@paxdiabloソリューションは機能しません。私が行ったように、両方の句を/d削除アクションにする方が移植性が高いようです。

上記を組み込んだ改訂されたコマンドは次のとおりです。

sed -e '/^\s*#.*$/d' -e '/^\s*$/d' inputFile
14
Chris Johnson

この小さな宝石は、コメントがどこから始まっていても、すべてのコメントを削除します。

sed -e 's/\s*#.*$//'

例:

text="
this is a # test
#this is a test
#this is a #test
this is # another #test
"

$echo "$text" | sed -e 's/\s*#.*$//'

this is a


this is

次に、結果の空白行を削除します。

$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d'
5
Elliptical view

Grepを使用した代替バリアント:


cat file.txt | grep -Ev '(#.*$)|(^$)'
3
demetrios

あなたはawkを使うことができます

awk 'NF{gsub(/^[ \t]*#/,"");print}' file
1
ghostdog74

最初の例(paxdiablo)は、変更ファイルではなく、出力結果のみを除いて、非常に優れています。インラインで変更したい場合:

Sudo sed -i 's /#.*$//;/^$/ d' inputFile

0
Tim Bikbaev

私のLinuxボックス(の1つ)では、sedは-rオプションを使用して拡張正規表現を理解します。

sed -r '/(^\s *#)|(^\s * $)/ d' squid.conf.installed

空白やコメント以外のすべての行を表示するのに非常に便利です。正規表現は、行の先頭に0個以上のスペースまたはタブが続き、その後にハッシュまたは行の終わりが続くものに一致し、それらの一致する行を入力から削除します。

0
Graham Nicholls