Grep

字元串的 Grep 命令不會僅在未註釋的行中退出

  • November 29, 2018
try2:
  set -vn
  set -o pipefail
  set -e
  if grep -v '^#' file.tx | grep -P 'name' file.tx; then \
     echo "    No name"; exit 0;\
     echo " This message is print from file.tx" \
     cat file.tx; fi
  1. 上面的程式碼是嘗試 grep 如果name在****file.tx中不存在,它會回顯**“No Name”**。如果它沒有在未註釋的行中退出,我只想對這個詞進行 grep,但它似乎不起作用。

2)如果第一個語句是錯誤的,我想怎麼做,它將轉到第二個語句。上面的命令似乎不起作用。

注意:這段程式碼寫在 Makefile 中,目標名稱是try2

問題是,您不是name在 中的非註釋數據中搜尋file.tx,而是grep針對原始文件執行

grep -v '^#' file.tx | grep -P 'name' file.tx
                                     ^^^^^^^
                                    will not read from pipe

相反,使用

grep -v '^#' file.tx | grep -q 'name'

即,不要使grep管道中的第二個從原始文件中讀取。此外,由於您只對grep(用於if語句) 的退出狀態感興趣,請將其與-q.


考慮到您的第二個問題,如果我理解正確,您似乎只想在字元串出現在註釋之外cat file.tx時才執行。name在這種情況下,您的邏輯倒退了。

if grep -v '^#' file.ex | grep -q 'name'; then

name如果字元串出現在非註釋行中,這將是正確的。如果你想要cat這個文件,那麼你需要在這裡做:

if grep -v '^#' file.ex | grep -q 'name'; then \
   cat file.tx; \
else \
   echo 'No name'; \
fi

我不確定exit 0這對 Makefile 目標的其餘部分有影響。如果您希望目標在不存在的情況下失敗,則在之後執行,否則根本不退出(除非您有其他不想在同一個 Makefile 目標中執行的 shell 程式碼)。name``exit 1``echo

我也注意到你的cd ../... 除非您file.tx在目前目錄目錄中../..有a ,否則您cat將失敗。您還沒有提到為什麼要升級兩個目錄級別,所以我不能多說。

另請注意,cd一旦 shell 片段完成,它將被“撤消”,因為make在單獨的 shell 實例中執行目標的每一行。這也意味著set您擁有的各種指令在單獨的shell 中執行。

如果我理解這個問題,你有一個這樣的文件:

帶有魔法詞名稱的評論

一些不包含魔法詞的東西

並且您希望列印“No name”。如果第一行未註釋,則不應列印“No name”。

以下應該做到這一點:

if grep -v '^#' file.tx | grep -q name; then
      echo "no name"
fi

在您的程式碼中,第二個grep包含文件名,因此它不會查看第一個的管道輸入。另外,由於您沒有使用 Perl 正則表達式,因此我刪除了-P, 並且還添加了-q以抑制任何grep可能在匹配時列印的輸出。

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