如何用输出自动替换原始文件?

如何用输出自动替换原始文件?

我有一个网站,我正在其中.scss使用命令格式化 sass ( ) 文件sass-convert。它的语法是这样的:

$> sass-convert original.scss formatted.scss

由于我在 git 存储库中,因此拥有单独的输出文件是完全多余的。我的下一步是mv formatted.scss original.scss。我想做一些事情来避免第二步。就像是

$> sass-convert original.scss %^&

哪里%^&有一些神奇的 shell/bash 语法可以完成我想要的功能。

有没有办法可以使用 bash (或其他 shell)语法在一行中自动将输出文件替换为输入文件?

我的问题不同于这个问题因为iconv将首先创建输出文件,这将使输入文件变空,所以下面列出的解决方案都不起作用。如果你看看这两个问题的答案,你会发现它们是不同的。此问题的答案适用于任何不会立即创建输出文件的命令。

答案1

Unix 程序可能有一个-i inplace开关(例如,旧版本sed没有,但现在大多数都从 窃取了该标志perl),请检查man页面以了解详细信息。这通常会导致程序将输出写入临时文件,然后执行调用rename(2)以在原始名称上写入新输出(此重命名还可能会破坏进程中的 selinux 上下文或其他奇特的 ACL,这可能是一个问题如果你使用那些东西)。

write-to-tmp-file-and-rename(2)模式的另一个解决方案sponge来自moreutils

$ echo hi > file
$ tr h b < file | sponge file
$ cat file
bi
$ 

答案2

使用 Bash历史运算符

sass-convert original.scss !#:$

!#指定当前行,:$最后一个参数(到目前为止)。

这适用于sass-convert;但对于更一般的用途,值得注意的是,在完成处理输入之前截断输出的程序将无法使用这种方法。

答案3

tcsh或模式zshemacs(通常是默认模式),您可以键入:

sass-转换原始.scssCtrl+Alt+_

Ctrl+Alt+_复制前一个单词(copy-prev-word小部件)。

请注意,它复制了之前的空白分隔单词,它不理解引用或类似的内容(与!#:$csh 风格的历史扩展相反)。

另一种方法(也适用于bash其他基于 readline 的 shell)仍在emacs模式中:

sass-转换原始.scssCtrl+WCtrl+Y Ctrl+Y

使用 zsh,您还可以执行以下操作:

(){sass-convert $1 $1} original.scss

对于 (t)csh/ksh/zsh/bash,使用大括号扩展:

sass-convert original.scss{,}

相关内容