【问题标题】:How do I replace a random line in a file without copying it into another file using Perl如何替换文件中的随机行而不使用 Perl 将其复制到另一个文件中
【发布时间】:2013-08-13 23:41:42
【问题描述】:

我在Git 中有一个 manifest.xml 文件,我需要创建一个 Perl 脚本,以便在文件中找到获取的路径。

例如,fetch="ssh://gerrit-xyz.com"。我必须用fetch="git://gerrit-xyz.com/projects/aosp" 替换这一行。

我不想将 XML 文件复制到新的,因为 XML 文件是巨大的,不值得。我只想通过正则表达式找到该行(通常在 XML 中的第 4-5 行)并将其替换为后一个版本的 fetch。

我看到的所有相关答案都建议复制到一个新文件中,这在我的场景中是不可接受的。我该怎么做?

【问题讨论】:

  • 看看Tie::File
  • 如果无法复制到新文件,则没有解决方案。好吧,您可以将要替换的材料之后的所有材料复制到文件中的新位置,然后写入新材料,但您可能会发现SO 10467711 的信息很有用。这仍然涉及在编辑后复制所有材料,这实际上与复制整个文件相同。只有新旧材料长度相同,才能避免问题。
  • sed -i 's|fetch="ssh://gerrit-xyz.com"|fetch="git://gerrit-xyz.com/projects/aosp"|g' 清单。 xml
  • @phs 它将复制整个文件的内容。
  • @phs:如果您使用的是 Linux,您可以使用 strace -o sed.strace sed -i.bak -e 's/=/@@/' somefile 来查看 sed -i 的作用。如果需要,您可以省略备份扩展名。在这两种情况下,您都会看到sed 创建一个新文件,写入它,然后重命名文件。 (注意,这意味着如果文件有多个硬链接,sed -i 会断开链接。如果文件是符号链接,则符号链接会被断开并替换为本地文件。)换句话说,“就地编辑” mode 使用输出创建一个新文件。在其他平台上,使用trussdtrace 或其他类似工具进行相同的分析。

标签: perl


【解决方案1】:

如果替换的长度不完全相同,则在不复制至少其余文件的情况下无法更改它。

【讨论】:

  • 如果行的长度不完全相同,则不能。这是数据如何存储在磁盘上的文件中。它只是一堆字节。想象一下,就像您拥有可以四处移动的指针一样。您可以将某些字节替换为其他字节,但指针后的字节不会移动。
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2014-12-05
相关资源
最近更新 更多