【发布时间】:2021-01-22 03:37:32
【问题描述】:
我有一个数据库卸载文件,其中的字段用
sed 命令 's/\t\t/\t\N\t/g;'几乎可以工作,只是它只替换第一个实例,例如“...
如果我使用 's/\t\t/\t\N\t/g;s/\t\t/\t\N\t/g;'它替换了更多实例。
我有一个概念,尽管有 /g 修饰符,但这与一场比赛的结束是另一场比赛的开始有关。
谁能解释正在发生的事情并提出一个可行的 sed 命令或者我是否需要循环。
我知道我可能会切换到 awk、perl、python,但我想知道 sed 中发生了什么。
【问题讨论】:
-
如果您可以明确回答替换重叠时应该发生的情况,我相信这会引起很多关注。如果输入是 a 并且请求替换
s/a/b/&s/b/a/,您的“并行”sed 会发生什么? (我使用 & 作为命令分隔符来表示两者应该同时发生。) -
另一个问题是无限循环:
s/something/something or other/和sed需要很长时间才能运行(或者更准确地说,它耗尽了内存)! -
感谢@triplee,当您认为重新扫描该行可能会引入循环时,这一点变得显而易见。
-
需要注意的是,如果
\t=a和\N=b然后aaa在第一个替换将被abaa和ababa替换在第二。因此不需要循环来替换所有情况,只需两次应用相同的全局替换。