我试图有一个 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.txt
。output.txt
该cat
命令在此与两个参数一起使用:
-
;这指示cat
首先从标准输入读取。标准输入流将包含包含标题文本的此处文档。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
请注意,如果最终输出应该是bash
shell 脚本,那么标头的第一行应该是带有解释器#!
绝对路径名的 -line bash
。
您也可以只使用printf
:
printf '%s\n' '#$ -cwd' '#$ -pe mpi 16' '' |
cat - output.txt >newfile.txt
它不是使用此处文档,而是用于printf
生成三行标题文本。结果将是相同的,但它看起来更丑陋,您需要理解代码才能看到标题文本实际上是什么样子(显然,除非您运行它)。