我没有找到完全相同的问题,所以我需要问:
我有一个文件gist :
...
must_be_intact
bad_line
bad_line
bad_line
match_line
...
我使用 awk 删除匹配之前但空格之后的所有内容:
'NR==FNR{if (/match_line/) {
i=0;
while(1) {
if (NR-i==/^\s*$/) break;
del[NR-i];
i=i-1;
next
}
}
} !(FNR in del)'
但这不能正常工作。帮助改进此代码,或者您可以建议其他方法。
最佳答案
你把事情想得太复杂了。
您可以只使用tac + awk + tac
操作:
tac file | awk '/^match_line$/,!NF{next} 1' | tac
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
must_be_intact
这个awk
使用从NF==0
(表示空行)到只有match_line
并使用的行的范围>操作 block 中的下一步
以跳过该部分。
关于bash - awk 在匹配之前删除空行之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71051831/