我目前正在使用此代码:
awk 'BEGIN { s = \"{$CNEW}\" } /WORD_MATCH/ { $0 = s; n = 1 } 1; END { if(!n) print s }' filename > new_filename
要在WORD_MATCH
上找到匹配项,然后在名为$CNEW
的文件中将该行替换为filename
,结果将写入new_filename
这一切都运作良好。但我有一个问题,我可能想删除该行而不是替换它。
所以我设置了$CNEW = ''
,因为我在文件中得到一个空白行,但实际上没有删除该行。
是否有适应AWK命令以允许删除线路?
总目标是:
如果包含WORD_MATCH的文件中没有一行,则根据$ CNEW
如果包含WORD_MATCH的文件中有一行更新该行与$ CNEW的新值
如果$ CNEW ='',则删除包含WORD_MATCH的行。
他的档案中只有一行包含WORD_MATCH
由于
答案 0 :(得分:2)
awk -v s="$CNEW" '/WORD_MATCH/ { n=1; if (s) $0=s; else next; } 1; END { if(s && !n) print s }' file
-v s="$CNEW"
这会将s
创建为值为$CNEW
的awk变量。请注意,使用-v
可以巧妙地消除尝试在BEGIN块中定义s
时可能出现的引用问题。
/WORD_MATCH/ { n=1; if (s) $0=s; else next; }
如果当前行与WORD_MATCH
匹配,则将n
设置为1
。如果s
非空,则将当前行设置为s
。如果没有,请跳过其余命令,然后从next
行重新开始。
1
这是打印线的神秘简写。
END { if(s && !n) print s }
在文件末尾,如果n
仍然不是1
且s
非空,则打印s
。