我正在尝试跟随这替换多行文本。
但要做到这一点,我想将如下所示的一些文本放入变量中。
```dataview
表没有 ID 页号为 no,链接(文件名,主题)为名称
WHERE back-to = this.file.link
SORT file.name asc
SORT page-no asc
```
我尝试了以下命令:
original="```dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n```"
但我收到此错误:
bash: command substitution: line 1: syntax error near unexpected token `(' bash: command substitution: line 1: `dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n'
怎样做才是正确的...
答案1
来自man bash
(强调我的):
将字符括在双引号中可保留引号内所有字符的字面值,除了$、`、,以及,当启用历史扩展时,!。
由于反引号不会按字面意思保留,因此 shell 将它们解析为命令替换 - 这里需要单引号,它保留所有字符的字面值。
OTOH,反斜杠像\n
are一样转义不是在单引号或双引号字符串中进行特殊处理 - 如果您想要换行符,您可以逐字包含它们。所以:
original='```dataview
TABLE WITHOUT ID page-no as no, link(file.name, topic) as name
WHERE back-to = this.file.link
SORT file.name asc
SORT page-no asc
```'
$ echo "$original"
```dataview
TABLE WITHOUT ID page-no as no, link(file.name, topic) as name
WHERE back-to = this.file.link
SORT file.name asc
SORT page-no asc
```
如果你确实想使用\n
,你可以在 bash 中使用ANSI C 引用,
original=$'```dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n```'
或者使用 shell 的内置printf
函数:
printf -v original '```dataview\nTABLE WITHOUT ID page-no as no, link(file.name, topic) as name\nWHERE back-to = this.file.link\nSORT file.name asc\nSORT page-no asc\n```'
但恕我直言,这些更难阅读。