【发布时间】: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。
我看到的所有相关答案都建议复制到一个新文件中,这在我的场景中是不可接受的。我该怎么做?
【问题讨论】:
-
如果无法复制到新文件,则没有解决方案。好吧,您可以将要替换的材料之后的所有材料复制到文件中的新位置,然后写入新材料,但您可能会发现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 使用输出创建一个新文件。在其他平台上,使用truss或dtrace或其他类似工具进行相同的分析。
标签: perl