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

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

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

ignore \..*
ignore README
projdir Snake

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

答案1

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

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^$是行开始/结束标记,因此模式将匹配整行;.*匹配任何东西。告诉-ised更改直接写入.ignore,而不是仅仅输出它们

答案2

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

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

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

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

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

答案3

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

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

sed -r 's/(^.*)Snake/\1PacMan' .ignore

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

答案4

回答标题“如何使用 sed 替换特定单词后的文本”中的问题:

sed -i '/projdir$/!{s/Snake/PacMan/}' .ignore

创造奇迹,因为它不期望Snake会与projdir!我们都知道

相关内容