shell - 为什么 sed 不替换重叠模式

标签 shell unix sed

我有一个数据库卸载文件,其中的字段以 字符分隔。我正在通过 sed 运行这个文件,用 \N 替换任何出现的 。这样当文件被加载到 MySQL 中时,\N 被解释为 NULL。

sed 命令 's/\t\t/\t\N\t/g;'几乎可以工作,除了它只替换第一个实例,例如"......"变为 "...\N..."。

如果我使用 's/\t\t/\t\N\t/g;s/\t\t/\t\N\t/g;'它取代了更多的实例。

我有一个概念,尽管有/g 修饰符,但这与一场比赛的结束是另一场比赛的开始有关。

任何人都可以解释正在发生的事情并建议一个可以工作或我需要循环的 sed 命令。

我知道我可能会切换到 awk、perl、python,但我想知道 sed 中发生了什么。

最佳答案

我知道你想要 sed,但 sed 根本不喜欢这个,它似乎特别(见 here)不会做你想做的。但是,perl 会这样做(AFAIK):

perl -pe 'while (s#\t\t#\t\n\t#) {}' <filename>

关于shell - 为什么 sed 不替换重叠模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421114/

相关文章:

c - 在字符串中遇到空格后程序未写入文件

bash - shell 脚本 (bash/ksh) : 20 seconds to read a variable

regex - 使用 sed 在 '.' 之前用 '_' 替换所有出现的 '='

bash - 我可以以编程方式在 bash 脚本中包含参数吗?

linux - 从 shell 脚本锁定 ubuntu

UNIX - 昨天的日期格式

regex - sed 正则表达式未按预期匹配

python - 如何从一个大文件中随机删除多行?

shell - 使用 sed 替换变音符号

shell - 如何在 AppleScript 中抑制/自动关闭错误对话框