2017-11-25 136 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

我将原始帖子中的确切字符串包含为值错误。我已经扩展了几个例子。 –