Bash

awk 或 Sed:如果找到模式:刪除行 && 導出變數

  • December 2, 2018

在我的 bashscript 中,我希望 Seddebug: Debug在文件中找到${SourceP},如果找到,則刪除該行並導出到環境Debug=Debug

sed -i '/debug: Debug/,+0 d' ${SourceP} && export Debug=Debug

但不幸的Debug=Debug是,即使沒有找到模式,它也會被導出。

我怎樣才能做到這一點:Debug=Debug僅在找到模式並刪除該行時才導出。

用sed不能實現嗎?


我試過這個,awk但這也不起作用:

awk -i inplace '!/debug: Debug/' ${SourceP} && export Debug=Debug

編輯:我希望debug: Debug準確搜尋。

awk您需要以某種方式從零件中導出資訊。您可以導出變數,也可以使用退出狀態

awk -i inplace 'BEGIN {err = 1}; {if (NR == 1 && /([[:space:]]|^)debug: Debug([[:space:]]|$)/) {err = 0} else {print}}; END {exit err}' ${SourceP} && export Debug=Debug

解釋

  • BEGIN {err = 1}:最初,將錯誤狀態設置為 1。
  • 然後,如果您在第一行NR == 1並且該行&&/([[:space:]]|^)debug: Debug([[:space:]]|$)/,請將錯誤狀態設置為 0 ( err = 0)。否則,列印所有其他行。此正則表達式debug: Debug以空格或行首開始,以空格或行尾結束。
  • awk腳本結束時,以錯誤狀態退出{exit err}
  • 因此,如果/debug: Debug/在文件中找到,則錯誤狀態將為 0 並且&&將執行。

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