Bash

在 bash 腳本的 if 語句中顯示帶有換行符的 grep 輸出

  • November 10, 2021

我想用腳本驗證文本文件。

要驗證的文件是:

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"

引用自:https://unix.stackexchange.com/questions/676786