一次调用 sed 进行多次编辑

rcl*_*ark 27 sed

我正在尝试使用 sed 来编辑配置文件。有几行我想更改。我知道在 Linux 下sed -i允许就地编辑,但它需要您保存到备份文件。但是,我想避免拥有多个备份文件并立即进行所有就地更改。

有没有办法做到这一点,sed -i或者有更好的选择吗?

Eig*_*ony 41

您可以sed通过重复-e(或者-f如果您的脚本在文件中)来告诉执行多个操作。

sed -i -e 's/a/b/g' -e 's/b/d/g' file在名为file, in-place的单个文件中进行这两项更改。没有备份文件。

sed -ibak -e 's/a/b/g' -e 's/b/d/g' file在名为file, in-place的单个文件中进行这两项更改。使用名为filebak.

  • 请注意,顺序很重要。在上面给出的示例命令中,字母`a` 的所有实例都变成了`b`,并且*then* 所有`b` 的实例都变成了`d`。你可以用 `sed -i -e 's/a\|b/d/g' file` 做同样的事情——把 `a` 或 `b` 的所有实例都变成 `d`。 (3认同)
  • 对于 mac 用户,再次执行 `sed -i '' -e` (2认同)

cas*_*cas 7

除了使用多个-e选项,您还可以使用换行符或分号在单个 sed 脚本中分隔 sed 命令。

无论该脚本是命令行上的单行还是脚本文件,情况都是如此。

例如

sed -e 's/a/b/g ; s/b/d/g' file
Run Code Online (Sandbox Code Playgroud)

周围的空格字符;是可选的。我在这里使用它们来确保分号突出(通常,除了换行符分隔命令,命令之间的空格被忽略......但不要忘记命令中的空格可以并且通常是重大)。

或者:

sed -e 's/a/b/g
        s/b/d/g' file
Run Code Online (Sandbox Code Playgroud)


Wil*_*ard 5

另一种选择是ex,前身到vi. 它实际上就地脚本文件编辑的首选 POSIX 工具;它sed -i比 Perl更加灵活,甚至可以说比 Perl 更加便携。(如果您不在 Windows 世界中,它无疑比 Perl 更具可移植性。)

有在该例子stackexchange命令的相对缺乏使用ex,至少与实施例的命令的使用过多相比sedawk和Perl。然而,我自己已经深入研究了POSIX 规范,ex从那以后我一直在为它打鼓。我在ex这里和 vi/Vim stackexchange 上都写了很多答案:

进一步阅读: