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 特定的并且非常不可移植。