web-dev-qa-db-ja.com

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

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

145
Village

これは sed one-liner で実行できます:

sed '/^#/ d'

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

245

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

grep -v '^#' filename

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

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

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

ただし、これは、たとえば、文字列リテラル内の#文字をコメントの開始として処理します(ケースに関連する場合も関連しない場合もあります)(そして空行を残します)。

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

grep -v '^ *#' filename

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

grep -v '^[  ]#' filename

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

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

48
Keith Thompson

レイモンドのソリューションの反対:

sed -n '/^#/!p'

「#で始まらない行を除き、何も印刷しないでください」

13
ata

Awkソリューションには次を使用できます-

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile
6
jaypal singh

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

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

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

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

5
A-B-B

ファイルを直接編集できます

sed -i '/^#/ d'

空白で始まるコメント行も削除したい場合は、

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

通常、スクリプトの最初の行がsha-bangである場合は保持したいので、sed#!で始まる行を削除しないでください。また、ハッシュのみを含み、テキストを含まない行を削除する必要があります。それをすべてまとめる:

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