2017-11-25 162 views
0

我正在清理很多markdown文件以將它們導入Pelican(一個靜態網站生成器)。編譯時,我得到有關多個文件中日期格式的錯誤。我需要做的是保留日期(yyyy-mm-dd)並刪除它後面的行尾。這是最後一次嘗試,我用sed和正則表達式製作:在匹配正則表達式之後刪除文件結尾保持多個文件中匹配的表達式(sed?)

sed -i "s/\(\d{4}-\d{2}-\d{2}\)\*/\1 /g" *.md

我的希望是,SED將採取括號內的整個圖案爲1,然後把它作爲替換字符串。

這是錯誤的例子(所有的數字變化):

ERROR: Could not process ./2010-12-28-the-open-internet-a-case-for-net-neutrality.html.md

| ValueError: '2010-12-28 21:22:00.000000000 +01:00 true' is not a valid date

ERROR: Could not process ./2011-05-27-two-one-must-read-internet-business-book.html.md

| ValueError: '2011-05-27 13:08:00.000000000 +02:00 true' is not a valid date

我環顧四周左右,但所有我發現是關於靜態字符串,而我總是在變化。

感謝您的幫助。

+1

也參見https://unix.stackexchange.com/questions/119905/why-does-my-regular -expression-work-in-x-but-in-y – Sundeep

+1

很好的參考文章,謝謝@sundeep –

回答

0

請注意這些文件,至少在使用sed之前進行備份。

這可以通過使用帶有擴展名的i標誌來完成:-i.bckup

所以我不確定你想修改文件或名稱本身的內容。 的,將只保留日期表達式是:

sed -r 's/([^-]*[-][^-]*[-][^-]*).*/\1/' 
+0

謝謝@ntj。我想更改文件的內容。 –

+0

它沒有工作。它會更改文件的其他部分(鏈接到圖像),但不會更改日期。 –

+0

'sed -r's /([0-9] {4} - [0-9] {2} - [0-9] {2})。*/\ 1/g''這將是一個更多嚴格的表達。請注意,日期後的所有字符都會在每行中刪除。現在這個expr全局運行。 – ntj

0

我懷疑你的sed沒有看到\d元字符意味着[0-9],所以用它來代替。

sed -i -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/' *.md 

注:

#與-r擴展正則表達式的選項,你不要逃避你的模式分組()

#無需對/g的選擇,因爲你是在第一場比賽之後,除去一切

.*可能是您打算使用的通配符。 *匹配任何數字的前面的模式,.匹配任何單個字符。

這裏是一個命令行試驗:

echo '2011-05-27 13:08:00.000000000 +02:00 true' | sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/' 

,其輸出:

2011-05-27 
+0

它改變了帖子中的其他行但不是我所針對的 –

+0

我已經使用錯誤消息中的信息添加了相同sed命令的工作命令行示例。也許你應該包含一個輸入文件的小例子。 –

+0

我將原始帖子中的確切字符串包含爲值錯誤。我已經擴展了幾個例子。 –