如何使用 sed 替换特定单词后的文本?

Jak*_*bčo 18 sed text-processing replace

我有一个名为.ignore. 需要更换projdir. 例如:

ignore \..*
ignore README
projdir Snake
Run Code Online (Sandbox Code Playgroud)

我需要将 Snake 替换为例如“PacMan”。我阅读了手册页,但我不知道该怎么做。

Mic*_*zek 23

搜索以 开头的行projdir,并用新行替换整行:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore
Run Code Online (Sandbox Code Playgroud)

^$是行首/行尾标记,因此模式将匹配整行;.*匹配任何东西。该-i通知sed直接写的变化.ignore,而不是仅仅将它们输出

  • 如果您使用“-i”的长选项,即“--in-place”,那么该示例将更加自文档化。 (3认同)

Gil*_*il' 6

一种方法是重写整行,对要保留的部分使用反向引用:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'
Run Code Online (Sandbox Code Playgroud)

另一种方法是重写该行的那部分,但前提是其他部分匹配:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'
Run Code Online (Sandbox Code Playgroud)

这两个示例都在第一个单词是 的行上重写了第二个以空格分隔的单词projdir


小智 5

尽管这是一篇旧帖子,并且似乎已通过接受的答案为您解决,但实际问题尚未得到解答。因此,为了完整性和帮助他人:

这里的答案实际上与“Snake”匹配,而不是“projdir”开头的行...

sed -r 's/(^.*)Snake/\1PacMan' .ignore
Run Code Online (Sandbox Code Playgroud)

这将包括“Snake”在内的行开头的所有内容替换为“Snake”+“PacMan”之前的所有内容。\1 代表 () 内匹配的内容。“蛇”之后的一切都保持不变。