2013-10-30 44 views
1

副標題:「我來這裏學習。」如何在列表中設置匹配項,將它們設置爲變量,重新格式化輸出並將其傳遞給另一個腳本?

我需要將我的幾個鏈接集合從Markdown轉換爲另一種格式(具體來說,通過this script將文件中的每行以單個音符的形式發送到Evernote)。

我的示例文件看起來都像這樣:

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

編輯:或者更精確地說:

* [Koken Installtion Help](http://help.koken.me/customer/portal/articles/2-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. Str IP前導星號/連字符/加按[REF](方括號中的所有內容)空白^[\*\-\+]\s
  3. 比賽內容用正則表達式(?<=\[)(.*)(?=\]) follwed它設置爲[URL](括號之間的一切)可變${titel}
  4. 比賽內容用正則表達式(?<=\()(.*)(?=\))並將其設置爲變量${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腳本的目標。

我有一個模糊的想法,如上所述,但它是一個相當大的挑戰,因爲我寫的腳本到目前爲止,其中更簡單,沒有涉及任何上述。

+0

markdown真的可以用正則表達式解析嗎?如果不是,你很快就會遇到兩個問題:你的原始問題,再加上正則表達式問題。 –

+0

你真的認爲'#!/ bin/sh',對嗎?明確地調用'#!/ bin/bash',如果這是你真正打算使用的。只調用'sh'可能會導致不同操作系統出現問題。祝你好運。 – shellter

+0

@shellter哦,是的,那是一個錯誤。我在編輯器中準備了這個問題,並且沒有註釋所有的行......並且哈希也一樣。雙倍是:我打算使用'#!/ bin/bash'。將解決它。 – pattulus

回答

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}"sed

fillText函數也可以在不同的文件中定義。

順便說一句,在你的代碼的某些部分的註釋:

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

是完全一樣的

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

(不考慮,我不知道是什麼'(?<=\[)(.*)(?=\])'手段

+0

感謝您提供精心設計的解決方案。在函數中使用佔位符變量是很好的。不知道。不幸的是,我沒有完全解釋我的需求,因爲我使用真正的「標題」和「網址」而不是「[REF_1](URL)」。我在這裏列出了所有的 - 所以缺少的一件事 - 我現在失敗的地方 - 是正確匹配內容的正確的正則表達式,並且使用sed匹配模式。 – pattulus

+0

我的不好。它應該從第一次迭代開始,但空白(像往常一樣)正在混合。 'sed'命令很好,但是將空格作爲位置參數傳遞給'fillText()'不是。我現在解決了。我們使用'sed'兩次獲取不同的參數,並在將它傳遞給fillText()' – pfnuesel

+0

哇之前將其存儲在一個變量中。這是一個夢想成真。最好的部分是我現在比以前更瞭解sed正則表達式。我將能夠爲其他項目製作版本。那很棒。非常感謝。 – pattulus

相關問題