ファイルに連続して21行以上の空行が含まれている場合は、エラーメッセージを送信する必要があります。スペースにはスペースを含めることができます。新しいサーバーに切り替えたとき、現在のソリューションが動作を停止しました。私は一度も動作しなかったかもしれませんが、私はさまざまなスクリプトが動作していることを確認する任務を担当しています。スクリプトはBashで書かれているので、理想的にはソリューションはBashで動作します。それ以外の場合は、問題になると思われるスクリプト内で切り替える必要があります。
エラーメッセージには、空白行の前後に行を含める必要があります。
これは以前に使用されたものです:grepを使用して質問の数を計算します(0より大きい場合は電子メールを送信します)。
grep -nc $'[\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a]' filename
問題行の表示(メールに表示)
grep -n $'[\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a]' filename
繰り返しますが、これがうまくいくかどうかわかりません。ただし、正しく機能するようにしてください。私はこれを試してみましたが、計算には働きます...しかし、空白があり、動作する前/後の行を取得できない場合は動作しません。
grep -czoP '\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n' filename
答え1
スクリプトを使用して、awk
ファイルに特定の数以上の空行があるかどうか、またはスペース(スペースおよび/またはタブ)のみが含まれているかどうかを検出します。
if ! awk -v max=21 '/^[[:blank:]]*$/ { if (++count >= max) exit 1; next } { count = 0 }'
then
echo 'file contains 21 or more consecutive blank lines'
else
echo 'file contains no more than consecutive 20 blank lines'
fi <file
これにより、入力ファイルの各行に対して正規表現が^[[:blank:]]*$
順番に一致します。この式は、空白行と空白および/またはタブのみを含む行と一致します。式が一致するとカウンタがインクリメントされます。カウンタが指定された最大値(コマンドラインmax
で設定された変数)に達すると、スクリプトはゼロ以外の終了状態で終了します。式が一致しない場合、カウンタはゼロにリセットされます。
答え2
正規表現を使用して、より複雑な一致を検索できます。あなたの場合は、空白文字(0個以上)を許可する各行に追加する必要があります(21行ではなく3行に切り捨てられました)。
grep -czP '[ ]*\n[ ]*\n[ ]*\n' filename
答え3
awk
あなたの質問に戻り、それが仕事に適していることに同意します。以下は、awk
空白行の前後の行を印刷するスクリプトです。
awk 'BEGIN{AA="";BB="";CC=0}{LST=CC;if(CC==0){BB=AA};AA=$0;if($0 ~ "^[[:space:]]*$"){CC++}else{CC=0;if(LST>21){print "Error:\n"BB"\n"LST" free, to:\n"AA"\n\n"}}}' searched.txt
デバッグに役立つawkコマンドをファイルに保存できます。これらのファイルは次のとおりです。
BEGIN{AA="";BB="";CC=0}
{ LST=CC;if(CC==0){BB=AA};AA=$0;
if( $0 ~ "^[[:space:]]*$") { CC++ }
else { CC=0;
if(LST>21) {print "Error:\n"BB"\n"LST" free, to:\n"AA"\n"}};
}
bashコマンドは次のようにする必要があります。
awk -f command.file searched.txt
空白の前後に1行以上があると仮定した例です。searched.txt
空白行(スペースを含む)以外に他の行がない場合は、この例を適用できます。searched.txt
21行以上の空行で始まるか終了します。
答え4
while read -r line; do
# add +1 every time the line is empty, reset the count if line contains anything
[[ -z $line ]] && i=$((i+1)) || i=0
if [[ $i -ge 20 ]]; then
# Do the error handeling in this block
echo "ERROR: 20+ empty consecutive lines"
break # stop reading file by breaking the loop
fi
done <file
この回答は、不足している条件を含むように編集されました。