如何在没有 Vim 的情况下从 shell 脚本替换文本并更改编码?

如何在没有 Vim 的情况下从 shell 脚本替换文本并更改编码?

我有一行 shell 脚本,如下所示:

vim file.xml -c "s/\r/\r/g" -c "set fileencoding=utf8" -c "wq"

它在 (macOS) 终端上运行得很好,但是当我在另一个程序(运行 AppleScript 的 FileMaker)中执行它时,它会挂起。我认为这是因为 Vim 实际上正在启动(我看到它在终端中闪烁),而 FileMaker 或 AppleScript 都失败了。

我怎样才能做与上面相同的事情,但只能使用不启动带有界面的应用程序的命令行工具?

答案1

ex是 Vim,用于脚本编写。

它将采用与 Vim 相同的命令,但它可以在没有终端 (tty) 的情况下运行。您可以向它传递一个-s“静音”标志。

:help -s-ex

-s:静默或批处理模式。 [...] 当使用 Vim 从文件执行 Ex 命令时使用而不是终端。 [...]

(请注意,这-s会抑制诊断和错误消息,并且可能会产生额外的副作用。有关详细信息,请参阅完整帮助。您的情况可能不需要它,但很可能需要。)

您可以将命令运行为:

ex -s file.xml -c "s/\r/\r/g" -c "set fileencoding=utf8" -c "wq"

请注意,“ex-mode”也可与该-e标志一起使用,因此这也应该有效:

vim -e -s file.xml -c "s/\r/\r/g" -c "set fileencoding=utf8" -c "wq"

答案2

sed是vim,但是用于脚本。它可用于通过它传输数据,或处理一个或多个文件。它基于与 vi 和 ed 相同的代码。它是非交互式的,因此没有窗口。

顺便说一句,我不认为它vim有自己的窗户。可能是某些东西(包装器)正在窗口中启动它。

答案3

如果问题出在git,您可以配置(详细信息gitattributes(5),通常在.gitattibutes存储库根目录中的文件中)working-tree-encoding对(选定的)签出文件使用 UTF16,在签入/签出时在 UTF8 之间进行转换。内部git使用 UTF8(例如diff,搜索、显示内容...)。

小心:非本地 git 可能无法理解这一点,并会带来悲伤。

相关内容