#で始まるすべての行をファイルから削除します


182

ファイル内のコメントを含むすべての行は、で始まります#。で始まるすべての行(およびそれらの行のみ)を削除するにはどうすればよい#ですか?行#の先頭ではなくを含む他の行は無視する必要があります。


1
#blah \<nl>blahバックスラッシュが改行をエスケープするため、単一の「論理行」としてカウントされる一般的な規則で動作する必要がありますか?
サルノルド、

@sarnold:とは別にmake、「コメントを終了する前にバックスラッシュスプライスラインを使用するユーティリティ」はどれですか。シェル(bashおよびkshテスト済み)はサポートしていません。CおよびC ++は、プリプロセッサディレクティブの他の処理の前に改行スプライシングを処理しますが、コメントではなくディレクティブです。
ジョナサン・レフラー、

@ジョナサン:すごい。一般的な\<nl>エスケープはコメントでも機能すると思いました。しかし、すごい私は間違っていました。私はまだ他の例を見つけることができません... :)ありがとう!
sarnold、

回答:


302

これは、sedワンライナーで実行できます。

sed '/^#/d'

これは、「#で始まるすべての行を見つけて削除し、他はすべて残しておく」と言います。


9
短いバージョン:sed /^#/d
kev

80
私のようなLinux noobsの場合:sed '/^#/ d' < inputFile.txt > outputFile.txt
Neil McGuigan 14

50
最短バージョン:sed -i '/^#/d' filepath
lesderid 2014年

14
そして、sed -i '' '/^#/d' filepathMac上で(-iサフィックスは必須であるため
paulcmは

1
@Viestursこれを試してください:awk '/^#/ && !first { first=1 ; next } { print $0}'
Raymond Hettinger

56

誰も最も明白な解決策を提案していないことに少し驚いています:

grep -v '^#' filename

これにより、前述の問題が解決されます。

ただし、一般的な規則では、a #から行の終わりまでのすべてをコメントとして扱うことに注意してください。

sed 's/#.*$//' filename

ただし、たとえば、#文字列リテラル内の文字はコメントの先頭として扱われます(大文字と小文字の区別がない場合もあります)(空の行が残ります)。

任意の空白で始まり、その後に続く行#もコメントとして扱われる可能性があります。

grep -v '^ *#' filename

空白がスペースのみの場合、または

grep -v '^[  ]#' filename

ここで、2つのスペースは実際にはスペースの後にリテラルのタブ文字が続きます(「control-v tab」と入力)。

これらのすべてのコマンドで、filename標準入力から(たとえば、パイプの一部として)読み取るには、引数を省略します。


この回答に基づいて新しい回答を追加しました。
Acumenus 2013年

Windowsでこのようにgrepを使用するときに問題が発生しました。解決策は、例えば、「'によって置き換えることであるgrep -v "^#" filename
Serg

14

レイモンドの解決策の反対:

sed -n '/^#/!p'

「#で始まらない行を除いて、何も印刷しません。」


9

あなたは直接あなたのファイルを編集することができます

sed -i '/^#/ d'

空白の使用で始まるコメント行も削除したい場合

sed -i '/^\s*#/ d'

通常、スクリプトの最初の行を残しておく必要があります(それがシャバンの場合)。したがって、でsed始まる行は削除しないでください#!。また、ハッシュのみを含みテキストは含まない行を削除する必要もあります。すべてをまとめる:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

すべてのsedバリアントに準拠するには、-iオプションにバックアップ拡張機能を追加する必要があります。

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

1
スペース1のプラス1
deepaksingh pawar


5

この答えは、キースによる以前の答えに基づいています

egrep -v "^[[:blank:]]*#" コメント行を除外する必要があります。

egrep -v "^[[:blank:]]*(#|$)" 頻繁に役立つように、コメントと空行の両方を除外する必要があります。

[:blank:]およびその他の文字クラスの詳細については、https://en.wikipedia.org/wiki/Regular_expression#Character_classesを参照してください


あなたegrepがその構文をサポートしていると仮定します。古いバージョンはそうでないかもしれません。
キーストンプソン

-3

これは、いくつかの拡張子を持つすべてのファイルのループです。

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.