在文件顶部添加两行注释

在文件顶部添加两行注释

我试图有一个 sed 脚本来进行更改并输出一个新文件,但它必须在顶部添加两个注释行,以便输出文件本身可以作为 bash 脚本运行。问题在于,我见过的所有添加两行顶行的解决方案都不适用于注释,这会导致脚本本身无法运行。

例如,如果我的 sed 结果是这样的文件:

AAAA
BBBB
CCCC
DDDD

我想最终得到这样的结果:

#$ -cwd
#$ -pe mpi 16

AAAA
BBBB
CCCC
DDDD

我已经尝试过类似这样的变化:

sed -i '1s/^/#$ -cwd\n/' output.txt

但这些会将 # 后面的所有内容视为注释。

如何编写一个 bash 脚本来添加注释标题而不弄乱自己?谢谢!

答案1

Kusalananda 的答案可能是最好的解决方案,因为它总是有效,但我也验证了仅使用 sed 解决方案也有效:

$ cat output.txt 
AAAA
BBBB
CCCC
DDDD
$ sed '1i#$ -cwd\n#$ -pe mpi 16\n' output.txt 
#$ -cwd
#$ -pe mpi 16

AAAA
BBBB
CCCC
DDDD

基本上使用 sed 的 (i)nsert 命令而不是 (s)substitute:
1- 在第 1 行上操作
i- 在第 1 行之前插入
1i- 在第 1 行之前插入

这适用于 gnu sed 4.8。青年MMV

答案2

为了避免与 一起使用时必须引用特殊字符等的所有问题sed,请使用引用的此处文档:

cat - output.txt <<'END_COMMENTS' >newfile.txt
#$ -cwd
#$ -pe mpi 16

END_COMMENTS

这会将三行额外文本与现有文件的内容连接起来output.txt,并将生成的文本放入newfile.txt.如果您愿意,您可以随意重命名newfile.txtoutput.txt

cat命令在此与两个参数一起使用:

  1. -;这指示cat首先从标准输入读取。标准输入流将包含包含标题文本的此处文档。
  2. output.txt;这是您现有的文件。当到达标准输入的数据全部被读取时,它将被读取。

测试:

$ cat output.txt
AAAA
BBBB
CCCC
DDDD

>下面各行开头的提示符是 shell 的辅助提示符,bash当需要更多输入来完成命令时使用。

$ cat - output.txt <<'END_COMMENTS' >newfile.txt
> #$ -cwd
> #$ -pe mpi 16
>
> END_COMMENTS
$ cat newfile.txt
#$ -cwd
#$ -pe mpi 16

AAAA
BBBB
CCCC
DDDD

请注意,如果最终输出应该是bashshell 脚本,那么标头的第一行应该是带有解释器#!绝对路径名的 -line bash


您也可以只使用printf

printf '%s\n' '#$ -cwd' '#$ -pe mpi 16' '' |
cat - output.txt >newfile.txt

它不是使用此处文档,而是用于printf生成三行标题文本。结果将是相同的,但它看起来更丑陋,您需要理解代码才能看到标题文本实际上是什么样子(显然,除非您运行它)。

相关内容