如何在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
```