1つのsedコマンドでコメント行(#bal blaとして)および空行(文字のない行)をファイルから削除する方法
THXリディア
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
オプションを使用しても、ファイルがその場で変更されることに注意してください。両方のコマンドが各行で実行されていることがわかります。コメントのある行では、最初にコメントが削除されてから、空のためすべて削除されます。
さらに、元の空の行も削除されます。
@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
この小さな宝石は、コメントがどこから始まっていても、すべての#コメントを削除します。
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'
Grepを使用した代替バリアント:
cat file.txt | grep -Ev '(#.*$)|(^$)'
あなたはawkを使うことができます
awk 'NF{gsub(/^[ \t]*#/,"");print}' file
最初の例(paxdiablo)は、変更ファイルではなく、出力結果のみを除いて、非常に優れています。インラインで変更したい場合:
Sudo sed -i 's /#.*$//;/^$/ d' inputFile
私のLinuxボックス(の1つ)では、sedは-rオプションを使用して拡張正規表現を理解します。
sed -r '/(^\s *#)|(^\s * $)/ d' squid.conf.installed
空白やコメント以外のすべての行を表示するのに非常に便利です。正規表現は、行の先頭に0個以上のスペースまたはタブが続き、その後にハッシュまたは行の終わりが続くものに一致し、それらの一致する行を入力から削除します。