如何使用 fish 添加文件
How to prepend a file using fish
我看到 bash
甚至 zsh
(即 Here)有几个很好的答案。虽然我没能为 fish
.
找到合适的
是否有规范或干净的方法可以将字符串或几行添加到现有文件中(就地)?类似于 cat "new text" >> test.txt
对追加所做的。
作为 fish 有意追求简单的一部分,它避免了 zsh 中的语法糖分。相当于 fish 中的 zsh-only 代码 <<< "to be prepended" < text.txt | sponge text.txt
是:
begin; echo "to be prepended"; cat test.txt; end | sponge test.txt
sponge
是 moreutils
包中的一个工具; fish 版本与 zsh 原始版本一样需要它。但是,您可以很容易地用函数替换它;考虑以下:
# note that this requires GNU chmod, though it works if you have it installed under a
# different name (f/e, installing "coreutils" on MacOS with nixpkgs, macports, etc),
# it tries to figure that out.
function copy_file_permissions -a srcfile destfile
if command -v coreutils &>/dev/null # works with Nixpkgs-installed coreutils on Mac
coreutils --coreutils-prog=chmod --reference=$srcfile -- $destfile
else if command -v gchmod &>/dev/null # works w/ Homebrew coreutils on Mac
gchmod --reference=$srcfile -- $destfile
else
# hope that just "chmod" is the GNU version, or --reference won't work
chmod --reference=$srcfile -- $destfile
end
end
function mysponge -a destname
set tempfile (mktemp -t $destname.XXXXXX)
if test -e $destname
copy_file_permissions $destname $tempfile
end
cat >$tempfile
mv -- $tempfile $destname
end
function prependString -a stringToPrepend outputName
begin
echo $stringToPrepend
cat -- $outputName
end | mysponge $outputName
end
prependString "First Line" out.txt
prependString "No I'm First" out.txt
对于文件大小中小(适合内存)的特定情况,请考虑使用 ed
程序,这将通过将所有数据加载到内存来避免临时文件。例如,使用以下脚本。这种方法避免了安装额外包(moreutils 等)的需要。
#! /usr/env fish
function prepend
set t $argv[1]
set f $argv[2]
echo '0a\n$t\n.\nwq\n' | ed $f
end
我看到 bash
甚至 zsh
(即 Here)有几个很好的答案。虽然我没能为 fish
.
是否有规范或干净的方法可以将字符串或几行添加到现有文件中(就地)?类似于 cat "new text" >> test.txt
对追加所做的。
作为 fish 有意追求简单的一部分,它避免了 zsh 中的语法糖分。相当于 fish 中的 zsh-only 代码 <<< "to be prepended" < text.txt | sponge text.txt
是:
begin; echo "to be prepended"; cat test.txt; end | sponge test.txt
sponge
是 moreutils
包中的一个工具; fish 版本与 zsh 原始版本一样需要它。但是,您可以很容易地用函数替换它;考虑以下:
# note that this requires GNU chmod, though it works if you have it installed under a
# different name (f/e, installing "coreutils" on MacOS with nixpkgs, macports, etc),
# it tries to figure that out.
function copy_file_permissions -a srcfile destfile
if command -v coreutils &>/dev/null # works with Nixpkgs-installed coreutils on Mac
coreutils --coreutils-prog=chmod --reference=$srcfile -- $destfile
else if command -v gchmod &>/dev/null # works w/ Homebrew coreutils on Mac
gchmod --reference=$srcfile -- $destfile
else
# hope that just "chmod" is the GNU version, or --reference won't work
chmod --reference=$srcfile -- $destfile
end
end
function mysponge -a destname
set tempfile (mktemp -t $destname.XXXXXX)
if test -e $destname
copy_file_permissions $destname $tempfile
end
cat >$tempfile
mv -- $tempfile $destname
end
function prependString -a stringToPrepend outputName
begin
echo $stringToPrepend
cat -- $outputName
end | mysponge $outputName
end
prependString "First Line" out.txt
prependString "No I'm First" out.txt
对于文件大小中小(适合内存)的特定情况,请考虑使用 ed
程序,这将通过将所有数据加载到内存来避免临时文件。例如,使用以下脚本。这种方法避免了安装额外包(moreutils 等)的需要。
#! /usr/env fish
function prepend
set t $argv[1]
set f $argv[2]
echo '0a\n$t\n.\nwq\n' | ed $f
end