次のような一連のコメントを含むファイルを印刷したいと思います。
</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でこれを実行したいと思います。
grep
の場合:
grep -v '^$\|^\s*\#' temp
awk
の場合:
awk '!/^ *#/ && NF' file
!/^ *#/
-#
記号が後に続くスペースがない行を選択することを意味しますNF
-空白でない行を選択することを意味します&&
-and
演算子で、上記の両方が真である場合に行を出力します。これはおそらく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
少しアップグレード
grep -v '^\s*$\|^#\|^\s*\#' filename
このコードは、空行またはスペースのみの行、#で始まる行、および#の前にスペースのみを含む行を除外します。
PS:^#
は^\s*#
とは異なります
これはすべきです:
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%確実なわけではありません:ポンド記号(#
)コメントを開始しません。つまり、エスケープされているか、文字列内にあります。まあ、何が起こるか想像できます。
GNU sed :のコード
sed -r '/^(\s*#|$)/d;' file
$cat file
</Directory>
ErrorLog ${Apache_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
next line is empty
line with leading space
# line with leading space and #
LogLevel warn
#line with leading tab and #
line with leading tab
CustomLog ${Apache_LOG_DIR}/ssl_access.log combined
# SSL Engine Switch:
$sed -r '/^(\s*#|$)/d;' file
</Directory>
ErrorLog ${Apache_LOG_DIR}/error.log
next line is empty
line with leading space
LogLevel warn
line with leading tab
CustomLog ${Apache_LOG_DIR}/ssl_access.log combined
grep ^[^#] filename
^
-行の始まり
[^#]
-#を除外します。
行頭にスペースがある場合は機能しません。
デフォルトのスペース区切り文字を使用する
だから、シンプルに保つ
awk '$1 ~ /^[^#]/ ' YourFile
sed -n '/^\s*[^#]\|^$/!'p filename
パターンは、行の先頭から始まり、#以外の文字が続く任意の量の空白(またはゼロ)と一致します。
または空の文字列(^と$の間に何もない)。
一致しないように、sedでは!演算子(一致を反転)を使用できます。パターンは、正規表現が収まらないすべてのものに一致するようになりました。
したがって、-n(何も印刷しない)とpの組み合わせ(パターン)以外に一致するフラグ(印刷)行が印刷されます。
egrep -v '^$|^#' /etc/sysctl.conf
Perlの場合:
Perl -lne 'print if ! /^\s*(#.*)?$/' file
これはC++コメントも無視します(//)
Perl -lne 'print if ! m{^\s*((#|//).*)?$}' file
grep -v '^$\|^#\|^\s*\#' filename
空行、#で始まる行、および#の前にスペースのみを含む行を除外します。
#!/bin/bash
#---------------------------------------------------------------#
# Programacion Shell #
# ------------------ #
# Programa: xable.sh (eXecutABLEs) #
### ###
# OBJETIVO: Filtrar solo las lineas ejecutables de un Shell #
# (eXecutABLEs) #
### ###
# Autor...: Francisco Eugenio Cabrera Perez #
# Pais....: Republica Dominicana #
# Fecha...: Abril 6 del 2015 #
#---------------------------------------------------------------#
x_FILE=$1
if [ -z $x_FILE ];then
echo
echo " $0 : Sin Argumento^G"; echo
echo "USO: $0 ARCHIVO"; echo
###
exit 1
fi
#####
# Ignore COMMENTs and lines that...
# ---------------------------------
# EXPLANATION (PATTERN) OBSERVATION
# ----------- --------- -----------
# 1. Begin_and_End_with_NOTHING (^$) NO_Characters
###
# 2. Begin_with_HASH_symbol (^#) COMMENT
# 3. Begin_with_SPACE_and_then_HASH_symbol (^\s*\#) COMMENT
###
# 4. Begin_and_End_with_SPACES (^[[:space:]]*$) Only_SPACES
# -------------------------------------------------------------------------
#####
grep -v '^$\|^#\|^\s*\#' $x_FILE | grep -v "^[[:space:]]*$" | more
#####
以下:
grep -v '^#\|^$\|^\s+$' file
#
で始まる行、空の行、および空白のみを含む行を標準出力に出力しないようにします。 |
文字をエスケープする必要があることに注意してください。役立つことを願っています
grep -v '^$\|^#\|^\s*\#' filename | grep -v "^[[:space:]]*$" | more