Awk 或 Sed:如果找到模式:删除行 && 导出变量

Awk 或 Sed:如果找到模式:删除行 && 导出变量

debug: Debug在我的 bashscript 中,我希望 Sed在文件中查找${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

答案1

您需要以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 并且&&将运行。

答案2

test "$(sed -i -e '/debug: Debug/{w /dev/fd/1' -e 'd}' "$SourceP")" && export Debug=Debug

笔记:

写作${SourceP}纯粹是矫揉造作;它和简单的一样危险$SourceP。你想要引用它改为:"$SourceP""${SourceP}"

/dev/fd/1大多数现代 Unixes 都支持;sed -i并且awk -i是 GNU 特定的并且非常不可移植。

相关内容