使用 printf 在文件开头插入带格式的文本

使用 printf 在文件开头插入带格式的文本

我需要在文本文件的开头附加具有特定格式的内容。我已经调查过如何在 Bash 中将文本附加到多个文本文件的开头和结尾,但不知道如何适应我的情况。

代码

printf 'Anything\tyou\twant\tto\tadd' 0a . x | ex printf.csv

预期产出

$ head -n 1 printf.csv;
Anything     you    want   to    add

注意:我更喜欢一个printf解决方案。

答案1

对于ex,那宁愿是这样的:

printf '%b\n' 0a 'Anything\tyou\twant\tto\tadd' . x | ex -s printf.csv

或者:

printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex -s printf.csv

请注意,参数识别的转义序列%b与格式参数中的转义序列不同。前者是标准echo的,后者是标准的类似 C 的(尽管许多printf实现对它们进行了扩展)。这对于 that 来说没有什么区别\t,但是你需要在参数中\11写入它 (至少如果你想便携的话)。\011%b

另一种选择是使用%sksh93 样式的$'...'引号进行\t扩展:

printf '%s\n' 0a $'Anything\tyou\twant\tto\tadd' . x | ex -s printf.csv

在它们受支持的地方(至少是 ksh93、zsh、bash、FreeBSD sh、busybox ash),这些$'...'引号通常支持标准 C 转义(带有扩展名),就像格式参数 to 中一样printf(与%b参数 或不同echo)。

答案2

  1. printf将格式字符串作为第一个非选项参数。如果第一个参数不使用像 之类的格式说明符%s,那么其余参数实际上是无用的。因此,如果您想使用第一个参数,因为这是\t解释转义字符的地方,则文本的其余部分也必须适合其中。
  2. 正如该答案所说:

    0a表示“在第 0 行之后追加文本”(换句话说,在第一行之前)。下一行是要在第 0 行之后“追加”的文字文本。.一行上的句点 ( ) 本身结束要追加的文本。

    0a应该来要附加的文本。

所以,像这样:

printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex printf.csv 

例子:

% printf '0a\nAnything\tyou\twant\tto\tadd\n.\nx\n' | ex printf.csv
"printf.csv" [New file]
"printf.csv" [New file] 1 line, 25 characters
% cat printf.csv                                                                                 
Anything    you want    to  add

答案3

只需使用cat命令即可。它设计用于 conCAT 文件。

假设您有test.txt包含以下内容的文件:

Test file
Here it is

您可以在以printf和开头附加一些文本cat,如下所示: printf "Some fancy text\n" | cat - test.txt

Some fancy text
Test file
Here it is

您可以将输出重定向到其他文件,最后将其保存在旧文件的位置(如果是这种情况)。

printf "Some fancy text\n" | cat - test.txt > /tmp/insertTestFile && mv /tmp/insertTestFile test.txt

这只是概念证明。在现实生活场景中,您应该考虑以下限制:

  • 在具有固定名称的目录中创建文件/tmp是个坏主意。tempfile如果需要,请考虑使用命令创建文件并将其名称存储在变量中
  • 跨不同文件系统使用mv会导致文件被复制
  • 上述解决方案将创建新文件并放弃前一个文件及其权限和 acl

我的目的是展示初学者易于理解的简单解决方案。非常感谢所有评论这个答案并指出可能误导的事情的人。

附言。我最喜欢的方法是使用sed -i '1s/^/Added text\n/' file.txt

相关内容