36

次のような一連のコメントを含むファイルを印刷したいと思います。

    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    #   SSL Engine Switch:

基本的に、ファイルには複数のインデント レベルが含まれており、コメントは#記号で始まります。

grep は、空白行と、テキストの前にハッシュ記号がある行 (これらがコメントであることを意味します) を削除する必要があります。

次の方法で空白行を削除できることを知っています。grep -v '^$'

ただし、先頭の空白と#記号を含む行を削除し、実際のコードを含む行のみを出力するにはどうすればよいですか? grep や sed を使用して、bash でこれを行いたいと考えています。

4

18 に答える 18

77

grep:

grep -v '^\s*$\|^\s*\#' temp

OSX / BSD システムの場合:

grep -Ev '^\s*$|^\s*\#' temp
于 2013-06-30T17:27:12.647 に答える
8

これはおそらくsed以下よりも簡単ですgrep:

sed -e '/^[[:space:]]*$/d' -e '/^[[:space:]]*#/d' test.in

または ERE の場合:

# Gnu sed need -re instead of -Ee
sed -Ee '/^[[:space:]]*(#|$)/d' test.in

ERE を使用すると、grep もかなり簡単に実行できます。

# Not sure if Gnu grep needs -E or -r
grep -vE '^\s*(#|$)' test.in

# or a BRE
grep -v '^\s*\(#\|$\)' test.in
于 2013-06-30T17:22:41.767 に答える
4

少しアップグレード

grep -v '^\s*$\|^#\|^\s*\#' filename

このコードは、空行またはスペースのみの行、# で始まる行、および # の前にスペースのみを含む行を除外します。

PS:^#とは異なります^\s*#

于 2016-02-13T21:28:43.960 に答える
4

これはすべきです:

sed 's/[[:space:]]*#.*//;/^[[:space:]]*$/d' file

この入力で:

Hello everybody

# This is a comment and the previous line was empty

This is a genuine line followed by a comment # this is the comment


              # and here a comment in the middle of nowhere

次の出力が得られます。

Hello everybody
This is a genuine line followed by a comment

警告。この種のメソッドは 100% 絶対確実というわけではありません: ポンド記号 ( #) がコメントを開始していない場合、つまり、エスケープされているか、文字列の中にある場合は、どうなるか想像できます。

于 2013-06-30T18:03:34.913 に答える
3
grep ^[^#] filename
  • ^- 行頭

  • [^#]- # を除外します。

行頭にスペースがある場合は機能しません。

于 2014-12-25T17:12:22.237 に答える
1
sed -n '/^\s*[^#]\|^$/!'p filename


パターンは、行の先頭から始まり、#または空の文字列 (^ と $ の間に何もない) 以外の任意の文字が続く任意の量の空白 (またはゼロ) と一致します。それに一致しないように、sed は!
の使用を許可します。演算子 (逆一致)。現在、パターンは正規表現が適合しないものすべてに一致します。 したがって、-n (印刷の抑制) とpフラグ (印刷) の組み合わせにより、パターン以外のすべてに一致する行が印刷されます。

于 2016-07-14T18:46:26.717 に答える
0
grep -v '^$\|^#\|^\s*\#' filename | grep -v "^[[:space:]]*$" | more
于 2015-04-06T19:39:34.513 に答える
-1
cat filename| egrep -v "^\s*$|^;|^\s*#
  • まず、catファイル
  • egrep -v削除します
  • ^$空行から始まる
  • ^;で始まります;
  • ^\s任意の先頭の空白に一致し、次に任意の文字まで一致します#
于 2014-11-26T03:18:06.087 に答える