字元串的 Grep 命令不會僅在未註釋的行中退出
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
- 上面的程式碼是嘗試 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
可能在匹配時列印的輸出。