如何在BASH中连接字符串和文件内容?

如何在BASH中连接字符串和文件内容?,bash,concatenation,Bash,Concatenation,我试图将名为query.sql的文件的内容(一段代码)连接到一个README.md文档中,该文档已经包含一些文本。然而,我也希望这段代码前面有一个标题“Model answer” 换句话说,如果我的README.md文件当前的结构是 # Title Some text here. 新文件应该如下所示 # Title Some text here. ## Model answer ```sql Contents of query.sql ``` 字幕##Model answer当前不在

我试图将名为
query.sql
的文件的内容(一段代码)连接到一个
README.md
文档中,该文档已经包含一些文本。然而,我也希望这段代码前面有一个标题“Model answer”

换句话说,如果我的
README.md
文件当前的结构是

# Title

Some text here.
新文件应该如下所示

# Title

Some text here.

## Model answer

```sql
Contents of query.sql
```
字幕
##Model answer
当前不在任何文件中,因此该过程应该包括以下内容

cat "## Model answer\n\n```sql\n" query.sql "\n```" >> README.md

但是
cat
仅适用于文件集,而不适用于文件和字符串。如何在BASH中实现所需的结果?

首先可以
printf
echo-e
所需的文本,然后
cat
文件
query.sql
。您可以使用
&&
在命令之间。如果使用了
&&
,则仅当第一个命令成功时,才会执行第二个命令<代码>被视为命令分隔符

{ printf "## Model answer\n\n \`\`\`sql" && cat query.sql && printf "\n\`\`\`"; } >> README.md

在bash中(正如您标记的那样),您可以执行以下操作

cat <(echo -e '## Model answer\n\n```sql') query.sql <(echo -e '```\n') >> README.md

这意味着连接文件描述符4、5和6、query.sql和文件描述符7,同时打开这些文件描述符并向它们发送相应的字符串。(这不需要Linux[在开发
/dev/fd
的地方]工作,bash解释
/dev/fd
本身,而没有它。这就是为什么不能执行
/dev/fd/[4-6]
)我选择这些文件描述符,因为0-2是为stdin、stdout和stderr保留的,而10及以上是为bash保留的,而且我不能正确计数。

你可以做一个复合语句
{echo“Title”;cat file.sql;}>result.md
@Mark Setchell这将删除文件
README.md
中已经存在的文本。我不完全理解你想做什么,所以我没有给出答案,只是用广义的术语对show进行了评论,如何混合使用
echo
cat
,希望您能够准确地计算出所需的命令。是否需要转义
printf
参数中的反勾号?@SeSodesa是,是。对不起,我已经更新了答案。使用单引号会更简单
printf'###模型答案\n\n\n``sql'
cat <(echo -e '## Model answer\n\n```sql') query.sql <(echo -e '```\n') >> README.md
cat <(echo -e '## Model answer\n\n```sql') query.sql - <<<'```'
$  cat /dev/fd/{4,5,6} query.sql /dev/fd/7 4<<<'### Model answer' 5<<<'' 6<<<'```sql' 7<<<'```'
### Model answer

```sql
Contents of query.sql
```