Regex 如何在列表中设置匹配项、将其设置为变量、重新格式化输出并将其传递给另一个脚本?
副标题:“我是来学习的。” 我需要将我的多个集合从Markdown链接到另一种格式(特别是,通过将文件中的每一行作为单个注释发送到Evernote) 我的示例文件如下所示: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;
* [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。我将能够为其他项目制作各种版本。太好了。非常感谢。