【问题标题】:How to substitute without creating intermediate file in sed?如何在不在 sed 中创建中间文件的情况下进行替换?
【发布时间】:2011-07-31 12:05:53
【问题描述】:

我正在动手操作 Unix sed 命令。我在一个文件中尝试了替换和附加命令。但是难点是,我要创建一个中间文件,然后mv重命名为原来的文件。

有没有办法在同一个文件中一次性完成?

[root@dhcppc0 practice]# sed '1i\
 > Today is Sunday
 > ' file1 > file1

[root@dhcppc0 practice]# cat file1
[root@dhcppc0 practice]#

文件被删除!

[root@dhcppc0 practice]# sed 's/director/painter/' file1 > file1
[root@dhcppc0 practice]# cat file1

文件被删除!

【问题讨论】:

  • 有人否决了我的问题?但为什么呢?

标签: linux unix sed


【解决方案1】:

试试这个 -

sed -i '' 's/originaltext/replacementtext/g' filename | cat filename

-i '' 用于提供备份文件。如果您确信您的替换不会导致问题,您可以输入 '' 以不传递任何备份文件

/g 用于全局替换。如果一行中有多个原始文本,则使用 /g 选项将替换所有其他内容,它只会替换第一个。

【讨论】:

  • 在 gitbash 上使用 sed -i'' 没有空格对我有用
  • sed -i ''(带空格)可用于 BSD sed,但只有 sed -i''(无空格)可用于 GNU sed。实际上很令人沮丧。
【解决方案2】:

GNU sed 知道一个选项 -i,它就地编辑给定的文件。

在执行file1 > file1 操作时,实际发生的是,文件打开截断外壳在程序之前(它以它的名字作为参数)来读取它的任何内容。

更新

sed 的手册页在 -i 选项上声明了以下内容(感谢 Delan 提及):

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if extension supplied)

【讨论】:

  • 真的吗?你的意思是使用 -i 选项我可以替换并附加到同一个文件?让我试试看。
  • 确保避免在-i 之后对任何其他选项参数进行短分组。我经常使用sed -i -r 对ERE 进行就地sed,但不能使用sed -ir,因为那样会进行备份,并在备份文件后加r
  • in-place 就像在中一样,编辑匹配的行,别管其他人。 追加。
  • 哇!太好了。唯一的问题是,使用 -i 到控制台的输出被抑制,但是是的,它被附加到文件中。有什么方法可以使用 -i 并进行控制台输出吗?
  • 我不知道。您始终可以将另一个命令与就地 sed 结合使用。
【解决方案3】:

sed -i.bak 's/director/painter/' 文件1

 -i[SUFFIX], --in-place[=SUFFIX]

    edit files in place (makes backup if extension supplied)

【讨论】:

  • 谢谢,是的,我试过了。但控制台输出被抑制。为你和 Fritschy 投票 :)
猜你喜欢
  • 2019-05-12
  • 2011-02-06
  • 1970-01-01
  • 2022-12-17
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多