空格字符弄乱了用于提取 Markdown 链接的 shell 脚本 grep 模式 (macOS)

发布于 2025-01-10 20:11:56 字数 814 浏览 0 评论 0原文

我正在开发一个将 markdown 文件转换为文本包的工具,修改 Zett 的一段很棒的代码 在 macOS 上使用,因为我将把我的 Apple Notes 文件移植到 Craft。

我在使用 grep 将所有链接解析为数组时遇到问题。无论我多么努力地尝试使用像 --null| 这样的选项xargs -0,结果最终被空格字符分割:

targets=($(grep '!\[.*\](.*)' "$inFile"))

示例:我有一个包含以下内容的小型 Markdown 测试文件:

# Allan Falk - ComicWiki

**Allan Falk - ComicWiki**

![Allan Falk - ComicWiki](images/Allan%20Falk%20-%20ComicWiki.png)

http://comicwiki.dk/wiki/Allan_Falk

运行上面的代码会创建以下数组,其中 Markdown 链接像这样被分割:

![Allan
Falk
-
ComicWiki](images/Allan%20Falk%20-%20ComicWiki.png)

我怎样才能获得完整的链接作为单独的数组条目(它们将在稍后单独处理,使用 sed 复制文件等)?

I am working on a tool to convert markdown files to text bundles, revising a great piece of code from Zett to use on macOS since I will be porting my Apple Notes files to Craft.

I have problems parsing all links into an array using grep. No matter how hard I try using options like --null and | xargs -0, the result ends up being split by whitespace characters:

targets=($(grep '!\[.*\](.*)' "$inFile"))

An example: I have a small markdown test file containing the following:

# Allan Falk - ComicWiki

**Allan Falk - ComicWiki**

![Allan Falk - ComicWiki](images/Allan%20Falk%20-%20ComicWiki.png)

http://comicwiki.dk/wiki/Allan_Falk

Running the above code creates the following array in where the markdown link is split up like so:

![Allan
Falk
-
ComicWiki](images/Allan%20Falk%20-%20ComicWiki.png)

How can I get complete links as individual array entries (they will be processed later individually, using sed for copying files etc.)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨洒年华 2025-01-17 20:11:56

您可以设置 IFS= (空值)并使用如下读取:

IFS= read -ra arr < <(grep '!\[.*\]' file)

# examine array
declare -p arr
declare -a arr='([0]="![Allan Falk - ComicWiki](images/Allan%20Falk%20-%20ComicWiki.png)")'

<(grep '!\[.*\]' file) 运行 grep< /code> 使用进程替换<,然后将此命令的输出发送到read

工作演示

You can set IFS= (null value) and use read like this:

IFS= read -ra arr < <(grep '!\[.*\]' file)

# examine array
declare -p arr
declare -a arr='([0]="![Allan Falk - ComicWiki](images/Allan%20Falk%20-%20ComicWiki.png)")'

<(grep '!\[.*\]' file) runs grep using process substitution and < before that sends output of this command to read

Working Demo

狂之美人 2025-01-17 20:11:56

经过一番挖掘后,我发现我的陈述中缺少引文。因此,我不需要写:

targets=($(grep '!\[.*\](.*)' "$inFile"))

我需要在第一组括号内添加引号:

targets=( "$(grep '!\[.*\](.*)' "$inFile")" )

现在数组工作正常 - 不会发生空格分割。

After doing some digging, I found out that I was missing quotations in my statement. So instead of writing:

targets=($(grep '!\[.*\](.*)' "$inFile"))

I needed to add quotation marks inside the first set of brackets:

targets=( "$(grep '!\[.*\](.*)' "$inFile")" )

Now the array works fine – no whitespace splitting occurs.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文