我需要在文本文件的开头附加具有特定格式的内容。我已经调查过如何在 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
另一种选择是使用%s
ksh93 样式的$'...'
引号进行\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
printf
将格式字符串作为第一个非选项参数。如果第一个参数不使用像 之类的格式说明符%s
,那么其余参数实际上是无用的。因此,如果您想使用第一个参数,因为这是\t
解释转义字符的地方,则文本的其余部分也必须适合其中。正如该答案所说:
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