Regex 如何在列表中设置匹配项、将其设置为变量、重新格式化输出并将其传递给另一个脚本?

Regex 如何在列表中设置匹配项、将其设置为变量、重新格式化输出并将其传递给另一个脚本?,regex,bash,shell,match,Regex,Bash,Shell,Match,副标题:“我是来学习的。” 我需要将我的多个集合从Markdown链接到另一种格式(特别是,通过将文件中的每一行作为单个注释发送到Evernote) 我的示例文件如下所示: * [REF_1](URL) * [REF_2](URL) * [REF_3](URL) #!/bin/sh document=~/file.txt notebook="My test notebook" keywords="test, demo" cat ${document} | while read line;

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

我需要将我的多个集合从Markdown链接到另一种格式(特别是,通过将文件中的每一行作为单个注释发送到Evernote)

我的示例文件如下所示:

* [REF_1](URL)
* [REF_2](URL)
* [REF_3](URL)
#!/bin/sh

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

cat ${document} | while read line; do \
    echo "$line" | sed -e '(?<=\[)(.*)(?=\])'; \
done
#!/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}"
编辑:或者更准确地说:

* [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)
…这是我的作战计划:

  • 解析每一行
  • 带前导星号/连字符/加号,后跟空格
    ^[\*\-\+]\s

  • [REF]
    的内容(方括号内的所有内容)与正则表达式
    匹配(?您可以使用
    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
    命令,使其可读性降低。数据和程序控制结构应该分开,因此我建议如下:

    * [REF_1](URL)
    * [REF_2](URL)
    * [REF_3](URL)
    
    #!/bin/sh
    
    document=~/file.txt
    notebook="My test notebook"
    keywords="test, demo"
    
    cat ${document} | while read line; do \
        echo "$line" | sed -e '(?<=\[)(.*)(?=\])'; \
    done
    
    #!/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}"
    
    完全一样

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

    sed'(?您可以使用
    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
    命令,使其可读性降低。数据和程序控制结构应该分开,因此我建议如下:

    * [REF_1](URL)
    * [REF_2](URL)
    * [REF_3](URL)
    
    #!/bin/sh
    
    document=~/file.txt
    notebook="My test notebook"
    keywords="test, demo"
    
    cat ${document} | while read line; do \
        echo "$line" | sed -e '(?<=\[)(.*)(?=\])'; \
    done
    
    #!/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}"
    
    完全一样

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

    sed'(?markdown真的可以用正则表达式进行分析吗?如果不能,你很快就会遇到两个问题:你原来的一个问题,加上正则表达式问题。你真的是指
    !/bin/sh
    ,对吗?如果你真的想用它,最好显式地调用
    !/bin/bash
    。只调用
    sh
    可能会在不同的操作系统上出现问题。很好ck.@Shelleter哦,是的,那是一个错误。我在编辑器中准备了这个问题,并取消了所有行的注释…散列也被取消了。双重肯定:我打算使用
    #!/bin/bash
    。将解决它。标记真的可以用正则表达式解析吗?如果不是,你很快就会有两个问题:你原来的一个问题,加上正则表达式问题。你真的意思是
    #!/bin/sh
    ,对吗?如果你真的想使用,最好显式调用
    #!/bin/bash
    。只调用
    sh
    可能会导致不同操作系统出现问题。祝你好运。@Shelleter哦,是的,那是个错误。我在编辑器中准备了这个问题,并取消了所有行的注释……哈希也被删除了。双重肯定:我打算使用
    #!/bin/bash
    。将修复它。感谢精心设计的解决方案。在函数中使用占位符变量非常好。我不知道。不幸的是,我没有准确解释我的需求,因为我使用的是真正的“标题”和“URL”,而不是
    [REF\u 1](URL)
    。我在这里概述了所有内容–因此缺少的一件事–我现在失败的地方–是正确的正则表达式,它正确匹配内容并使用sed匹配模式。我的错。它从第一次迭代开始就应该工作,但是空格(像往常一样!)我们把事情搞混了。
    sed
    命令很好,但是将空格作为位置参数传递给
    fillText()
    没有。我现在已经解决了这个问题。我们使用
    sed
    两次来获取不同的参数,并将其存储在变量中,然后再将其传递给
    fillText()
    Wow。这是一个梦想成真。最好的部分是我现在比以前更了解sed regex。我将能够为其他项目制作变体。太好了。非常感谢。感谢精心设计的解决方案。在函数中使用占位符变量很棒。我不知道。不幸的是,我没有解释我的需求正是因为我使用的是真正的“Titles”和“URL”,而不是
    [REF_1](URL)
    。我在这里概述了这一切——因此缺少的一件事——我现在失败的地方——是正确的正则表达式,它与内容正确匹配,并使用sed匹配模式。我的错。它应该从第一次迭代开始就可以工作,但是空白(像往常一样!)把事情搞混了。
    sed
    命令很好,但是将空格作为位置参数传递给
    fillText()
    没有。我现在已经解决了这个问题。我们使用
    sed
    两次来获取不同的参数并将其存储在变量中,然后再将其传递给
    fillText()
    Wow。这是一个梦想成真。最好的部分是我现在比以前更了解sed regex。我将能够为其他项目制作各种版本。太好了。非常感谢。