假设我有一行要添加到文件中而无需打开编辑器。

我怎么能将此行附加到

alias list='ls -cl --group-directories-first'


到此文件

config.fish


#1 楼

您可以使用>>运算符将一行文本附加到文件中:

echo "hello world" >> my_file.txt


或者在您的情况下

echo "alias list='ls -cl --group-directories-first'" >> config.fish


请注意不同类型的报价。

评论


我自己使用echo,但是要小心,如果只指定一个>,则文件将被截断,而不是追加。为了更安全的命令,您可以使用sed:sed -i'$ a hello world'文件名

–反转
2011-1-25在8:05

说明:-i将更新文件(否则它将仅将结果打印到stdout),$是正则表达式,它将匹配文件的末尾,并在文件名后追加以下文本。

–反转
2011-1-25在8:08

echo“ hello world” >> my_file.txt不会使用HW创建新的最后一行,而是将其添加到最后一行的字符串中。

– Timo
17年3月3日在7:28

什么是HW @timo?

– 7wp
18年7月3日在3:50

也许是“ Hello World” @ 7wp :)回声增加了换行符(使它成为一行而不是一串字符)。您可以在末尾使用-n关闭换行符。

– Stefano Palazzo
18年7月3日在14:59

#2 楼

除了Stefano的答案外,您还可以使用cat



使用heredoc:

$ cat >> config.fish <<'EOF'
> alias list='ls -cl --group-directories-first'
> EOF


<<'EOF'意味着“将以下内容作为输入,直到到达只是EOF的行。”引号意味着直接输入。


或在stdin上输入行:

$ cat >> config.fish


然后粘贴或键入该行,按Enter转到新行,然后按Ctrl + D标记结束。



#3 楼

有很多无需打开文本编辑器即可追加到文件的方法,特别是通过Ubuntu中的多个可用文本处理实用程序。通常,任何允许我们执行添加了open()标志的O_APPEND syscall的东西,都可以用来附加到文件中。




dd实用程序的GNU版本可以将数据附加到文件中。带有conv=notrunc oflag=append的文件

printf "\nalias list='ls -cl --group-directories-first'\n" | dd conv=notrunc oflag=append bs=1 of=config.fish


可移植的是,我们可以在管道的右侧使用如下所示的内容:

dd conv=notrunc seek=$(wc -c < testFile.txt) bs=1 of=testFile.txt


请注意bs=1的使用,这是为了防止从管道中进行短读。


当需要附加到文件并将其发送到stdout或下一个命令时,可以使用tee命令。管道

tee -a config.fish <<< "alias list='ls -cl --group-directories-first'"



awk具有附加运算符>>,它也是可移植的并由POSIX规范定义。

awk 'BEGIN{ printf "alias list=\x27ls -cl --group-directories-first\x27\n" >> "config.fish"  }'



我们可以结合使用sed的标志$来匹配最后一行,其中a用于追加,-i用于就地编辑。

sed -i '$a alias list='"'"'ls -cl --group-directories-first'"'" config.fish


甚至可以在Python 3中实现类似dd的功能:

     #!/usr/bin/env python3
    # read bytes from stdin, append to specified file
    import sys

    with open(sys.argv[1],'ab') as f:
         f.write(sys.stdin.buffer.read())
 


另请参见:


bash中<<,<<<和<<有什么区别?
&>和2>&1
有什么区别?如何将stderr重定向到文件
有什么区别? “ cat <文件名”和“ cat文件名”之间是什么?
“重定向”和“管道”之间有什么区别?