1

副标题: “我是来学习的。”

我需要将 Markdown 中的几个链接集合转换为另一种格式(具体而言,通过此脚本将文件中的每一行作为单个注释发送到 Evernote )。

我的示例文件都如下所示:

* [REF_1](URL)
* [REF_2](URL)
* [REF_3](URL)

编辑:或更准确地说:

* [Koken Installtion Help](http://help.koken.me/customer/portal/articles/632102-installation)
* [A couple of Sass functions](http://hugogiraudel.com/2013/08/12/sass-functions/)
* [Chris Coyier's Favorite CodePen Demos](http://davidwalsh.name/chris-coyiers-favorite-pens)

……这是我的作战计划:

  1. 解析每一行
  2. 去掉前导星号/连字符/加号后跟空格^[\*\-\+]\s
  3. [REF] 将(方括号之间的所有内容)的内容与正则表达式匹配(?<=\[)(.*)(?=\])并将其设置为变量${titel}
  4. [URL] 将(括号之间的所有内容)的内容与正则表达式匹配(?<=\()(.*)(?=\))并将其设置为变量${url}
  5. 如下例所示格式化新输出。
  6. 保存到变量/剪贴板/标准输出(←我不知道哪个效果最好)并markdown2evernote.rb在上面运行
  7. 所有线路都发送?→ 完成。

示例(见第 5 点):

Notebook: ${notebook}
Title: ${title}
Url: ${url}
Keywords: ${keywords}

Content Area

Will use the $title and $url variable here again.

坦率地说,我还没有走多远。我已经被困在第二点,因为我不知道如何让正则表达式工作。目前,我的 bash 脚本如下所示:

#!/bin/sh

document=~/file.txt
notebook="My test notebook"
keywords="test, demo"

cat ${document} | while read line; do \
    echo "$line" | sed -e '(?<=\[)(.*)(?=\])'; \
done

我不在乎它是否是一个 sed/grep/awk 解决方案——只要它是一个 shell 脚本,我就接受它。

在检查了列表中的第 2 点和第 3 点并达到我可以将格式化的输出移交给 ruby​​ 脚本的目标之后,我还想知道什么是最好的方法。

如上所述,我有一个模糊的想法,但这是一个相当大的挑战,因为到目前为止我编写的脚本要简单得多,并且不涉及上述任何内容。

4

1 回答 1

1

您可以使用sed提取变量并写入输出。

sed 's/^[*-+] *\[\(.*\)\](\(.*\))/Notebook: x\nTitle: \1\nUrl: \2\nKeywords: y\n\nContent Area\n\nWill use the \1 and \2 variable here again/' file.txt

通过使用\(\)你可以访问这些括号内的模式\1\2等等。

但是,如果您的输出包含大量文本,您将sed只使用文本来破坏命令,使其可读性降低。数据和程序控制结构应该分开,所以我建议这样:

#!/usr/bin/env bash

fillText(){
    echo "Notebook: ${1}"
    echo "Title: ${2}"
    echo "Url: ${3}"
    echo "Keywords: ${4}"
    echo
    echo "Content Area"
    echo
    echo "Will use ${2} and ${3} variable here again."
}

document=file
notebook="My test notebook"
keywords="test, demo"

while read line; do
    title=$(sed 's/^[*-+] *\[\(.*\)\](.*)/\1/' <<< "${line}")
    url=$(sed 's/^[*-+] *\[.*\](\(.*\))/\1/' <<< "${line}")
    fillText "${notebook}" "${title}" "${url}" "${keywords}"
done < "${document}"

该函数fillText()以您喜欢的方式编写输出,它需要四个位置参数,其中两个是从"${document}"with中提取的sed

fillText 函数也可以在不同的文件中定义。

顺便说一句,对您的代码的某些部分进行评论:

cat ${document} | while read line; do \
    echo "$line" | sed -e '(?<=\[)(.*)(?=\])'; \
done

完全一样

sed '(?<=\[)(.*)(?=\])' "${document}"

(尽管我不知道是什么'(?<=\[)(.*)(?=\])'意思。

于 2013-10-30T20:49:29.243 回答