【问题标题】:Append file to file in bash without cat在没有cat的情况下将文件附加到bash中的文件
【发布时间】:2015-11-30 23:38:00
【问题描述】:

使用catcat file1 >> file2 可以轻松地将现有文件附加到另一个文件

有时我读过人们写的内容,“不要使用cat,除非你正在连接两个文件。”这是明智的。如果只接受一个参数,则不需要 cat:cat file | xargs programxargs program < file 差。

那么如何在没有 cat 的情况下将文件附加到另一个文件? < file1 >> file2>> file2 < file1 都不起作用。如果我必须调用一个程序来做到这一点,正统的方式是什么?

【问题讨论】:

  • 你误解了禁令;如果您所做的只是将 one 文件的内容传送到另一个命令,则不应使用 cat,在这种情况下,输入重定向更合适。这里,cat唯一涉及的程序。
  • 这里你正在连接两个文件,所以没关系。
  • 现在如果这是zsh,我会说“是的,cat 没用,改用<file1 >>file2。” :)

标签: bash file append


【解决方案1】:

cat 的正统用法。 “对cat 的无用使用”涉及使用cat 读取单个 文件的内容并将它们传送到另一个程序,该程序可以使用输入重定向直接从文件中轻松读取。在这里,cat 正在做所有的阅读写作;没有什么比它更简单的了,因为bash 没有提供从标准输入读取写入标准输出的内置函数。

【讨论】:

  • 我知道这已经有一年多了,但我偶然发现了它,我只想提一下,虽然我不知道有任何 bash 内置函数可以读取标准输入并写入标准输出,但我确实知道awk 完全可以接受将标准输入输出到标准输出,并且由于其目的不是连接文件,因此很容易避免UUOC。请注意,默认模式匹配所有行,默认操作是写入行,因此awk file 将完成与cat file 相同的事情,但没有 UUOC 困境。
  • awk filecat基本相同。如果一个合适,那么另一个也合适。如果一个不合适,那么另一个也不合适。目标不是特别避免cat,而是any 可以被简单的输入重定向替换的外部进程。 (awk 的某些实现可能至少需要一个模式或一个操作,例如 awk 1 fileawk '{print}' file。)
【解决方案2】:
# Redirecting Input 'from' file to Command Substitution as "echo" argument
# "echo" stdout write 'to' file
echo "$(<from)" > to

# Redirecting Input 'from' file to Command Substitution as "printf" argument
# "printf" stdout write 'to' file
printf "%s" "$(<from)" > to

# Redirecting Input 'from' file to "sed" and stdout write 'to' file
sed -n '/.*/p' <from > to

envsubst
在正常操作模式下,标准输入被复制到标准
输出,引用格式为“$VARIABLE”的环境变量
或“${VARIABLE}”被替换为相应的值。

# create file with name 'template'
echo '$buf' > template

# Redirecting Input 'from' file to Command Substitution 
# Assign to 'buf' variable and export 
# envsubst standard input from 'template' file copied 'to' file
export buf="$(<from)" && envsubst < template > to 

【讨论】:

  • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
【解决方案3】:

你可以的

while read line
do
    echo $line
done < file1 >> file2

【讨论】:

  • 你可以(如果你做对了:IFS= read -r lineecho "$line"printf "%s" "$line"),但何必呢?在这种情况下使用cat 没有任何问题,它更容易输入,而且可能比尝试在 shell 中逐行读取文件更快。
【解决方案4】:

echo 与文件重定向一起使用:

for f in /path/file1 /path/file2 /path/file3
do
    echo "$(<"$f")"
done >> /path/destination

如果需要,请记住正确引用您的输入数组。

解释:$(&lt;"$f") 使用文件$f 的内容为echo 创建一个参数。

【讨论】:

    【解决方案5】:

    使用tee 命令,您可以附加到文件。

    tee file1 --append < file2 > /dev/null
    

    你也可以使用dd

    dd status=none of=file1 oflag=append conv=notrunc,nocreat if=file2
    

    最后一个有点作弊,但我们也可以像这样滥用文件描述符:

    exec 5>>file1; tail -qn +1 file2 >&5
    

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多