Bash
在 bash 腳本的 if 語句中顯示帶有換行符的 grep 輸出
我想用腳本驗證文本文件。
要驗證的文件是:
FDFHDK JKL 1545665 152 HDKFHDK UHG YRYRUBH DFG 867HDKE WER
有效行必須與正則表達式匹配
'[A-Z]{7}+[[:space:]]+[A-Z]{3}'
。如果所有行都有效,則腳本會顯示一條消息,說明文件正常。
如果至少有一行與正則表達式不匹配,則腳本應顯示一條消息並顯示與正則表達式不匹配的行。
腳本是:
#!/usr/bin/env bash result="" output=$(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1" |wc -l) if [[ $output > 0 ]] then echo "These lines don't match:" result="${resultado} $(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1") \n" echo -e $result else echo "The text file is valid" fi
預期的輸出是
These lines don't match FDFHDK JKL 1545665 152 867HDKE WER
但我越來越
These lines don't match: FDFHDK JKL 1545665 152 867HDKE WER
所以實際的腳本沒有考慮換行符。
絕對沒有理由使用中間變數來儲存命令的輸出只是為了執行測試或輸出該數據。
#!/bin/sh - if grep -q -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1" then echo 'Does not verify. Bad lines follow...' grep -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1" fi
正則表達式已被更正以刪除多餘的
+
after{7}
。該if
語句直接測試退出狀態grep
。語句中的grep
命令以及之後的命令用於強制進行整行匹配,第一個語句用於在第一個匹配時停止而不輸出任何內容。if``-x``grep``-q
程式碼中的實際問題是使用不
$result
帶引號的,這會導致 shell 將值拆分為空格、製表符和換行符,然後對生成的單詞進行文件名萬用字元。然後將最後一組單詞作為參數給出,echo
並以空格作為分隔符將它們列印出來。如果您擔心執行
grep
兩次,則只執行一次並將其輸出儲存到例如臨時文件中:#!/bin/sh - tmpfile=$(mktemp) if grep -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1" >"$tmpfile" then echo 'Does not verify. Bad lines follow...' cat -- "$tmpfile" fi rm -f -- "$tmpfile"