Tab 多行变量到 heredoc

Tab multiline variable to heredoc

提问人:st0ve 提问时间:9/29/2023 更新时间:9/29/2023 访问量:41

问:

我正在尝试将多行变量添加到将放入 markdown 文件中的 heredoc 中。

我的脚本如下所示:

markdown=$(cat <<-EOF
<details>
    <summary>TEST</summary>

    ${output}
</details>
EOF
)

echo "$markdown" >> test.md

其中,多行字符串:output

this
is a
multiline
string

当我运行脚本时,输出如下所示:

<details>
    <summary>TEST</summary>

    this
is a
multiline
string
</details>

我怎样才能得到它,以便不仅输出变量的第一行被正确地按选项卡列出?我尝试通过 sed 运行变量并添加选项卡,但这不起作用

bash markdown eof heredoc

评论

1赞 KamilCuk 9/29/2023
那么,如果您想保留选项卡,为什么要使用 in?您想要制表符 - 特别是水平水平字符 - 还是要缩进输出?Markdown 使用空格,我认为它不使用制表符。--EOF
1赞 Ed Morton 9/29/2023
当您在问题中说“Tab”和“Tabbed”时,您实际上是指“缩进”和“缩进”吗?对于在分隔符之前带有 here-documents 来说,这有很大的不同。-

答:

1赞 KamilCuk 9/29/2023 #1

你必须缩进它。你自己。例如,使用 sed 在每行前面添加 4 个空格:

cat <<-EOF
<details>
    <summary>TEST</summary>

$(sed 's/^/    /' <<<"$output")
</details>
EOF

您可以将换行符替换为换行符和 4 个空格:

cat <<-EOF
<details>
    <summary>TEST</summary>

    ${output//$'\n'/$'\n'    }
</details>
EOF

评论

0赞 st0ve 9/29/2023
像魅力一样工作!谢谢
0赞 Ed Morton 9/29/2023 #2

如果您希望从字面上处理前导选项卡,那么不要告诉 shell 不要从字面上处理它们,即删除您在第一个 EOF 之前添加的:-

cat <<EOF
    whatever
EOF

不是你问的问题,但不要从这里的文档中填充变量,然后将其回显到一个文件,只需将输出重定向到一个文件:cat

cat <<EOF > file
    whatever
EOF

或者,如果您想将文本存储在变量中,请不要使用 here-doc:

markdown="<details>
    <summary>TEST</summary>

    $output
</details>"

printf '%s\n' "$markdown" > file