你现在真的进入了一些神秘的 sed 魔法。保持简单,只需使用清晰的函数名称、变量和可理解的结构在 awk 中编写:
$ cat file
1 2 3 4 5 6
$ awk 'match($0,/4/){
pre=substr($0,1,RSTART-1)
gsub(/./," ",pre)
print pre substr($0,RSTART)
}' file
4 5 6
sed 是用于在单行上进行简单替换的出色工具,但对于其他任何事情,只需使用 awk。如果您使用超过 s、g 和 p(带 -n)的 sed 语言结构,那么您使用的工具是错误的。大约在 1976 年 awk 被发明后,几乎所有其他 sed 语言结构都过时了。
如果你一年后回来改进这个脚本来做一些不同的事情,例如在行尾打印一个计数,现在许多字符已被空格替换,您是否愿意尝试理解然后修改它:
sed 's/\(4\)/\n\1/;Tq;h;s/^[^\n]*\n//;x;s/\n.*//;s/./ /g;G;s/\n//;:q'
还是上面的 awk 脚本?在 awk 脚本中进行的调整只是添加和打印一个变量(下面的cnt):
awk 'match($0,/4/){
pre=substr($0,1,RSTART-1)
cnt=gsub(/./," ",pre)
print pre substr($0,RSTART), cnt
}' file
我预计,要让 sed 脚本执行此操作,需要 3 只山羊、一个血月和蝙蝠侠符号。