Chinaunix

标题: sed 替换字符串 [打印本页]

作者: shihyu    时间: 2015-09-05 00:40
标题: sed 替换字符串
本帖最后由 shihyu 于 2015-09-05 00:42 编辑

sed 替换字符串
  1. .. image:: /_static/SimpleFactory.jpg
复制代码
image:: 改成 ![](   没问题,  但能加上 )


最后变成下面字符串

![](/_static/SimpleFactory.jpg)

谢谢
作者: haooooaaa    时间: 2015-09-05 05:54
  1. $ sed 's@.* \(/.*jpg\)@![](\1)@' a
  2. ![](/_static/SimpleFactory.jpg)
复制代码

作者: sunzhiguolu    时间: 2015-09-05 10:19
本帖最后由 sunzhiguolu 于 2015-09-05 11:08 编辑

回复 2# haooooaaa
大神,小弟在看您的正则时,有一点不懂请大神指点迷津...
sed 's@.* \(/.*jpg\)@![](\1)@' a

代码中,红色部分捕获的内容如何确保是一个完整的路径,即如下字符串,:
/_static/SimpleFactory.jpg
而不会变成诸如:
/SimpleFactory.jpg

如果文中在 "image:: " 之后部分的字符串是类似 /_static/header/top_head1.jpg , /_static/footer/AD/left_footer1.png 等包含路径嵌套的情形.
如何避免错误的命中,即只捕获从文本行中倒数第一个/字符之后,后面紧跟图像名称的完整档案名.

请大神指点..,多谢多谢...



   
作者: 聆雨淋夜    时间: 2015-09-05 11:36
echo ".. image:: /_static/SimpleFactory.jpg"|sed -r 's/^.*:: (.*)/![](\1)/'
![](/_static/SimpleFactory.jpg)
作者: sunzhiguolu    时间: 2015-09-05 12:32
本帖最后由 sunzhiguolu 于 2015-09-05 14:48 编辑

回复 4# 聆雨淋夜
前辈,看了您给出的答案大受启发,小弟有个问题向您请教,请您指点,假设在路径中出现与正则中限定字符串位置的字符串相同的字符串该如何进行处理?
... image:: /_static/... image:: /birthday_party.bmp


   
作者: haooooaaa    时间: 2015-09-05 14:33
回复 3# sunzhiguolu
  1. $ more b
  2. /_static/footer/AD/left_footer1.png

  3. $ sed 's@.*/\(.*.png\)@\1@' b
  4. left_footer1.png
复制代码

作者: sunzhiguolu    时间: 2015-09-05 14:41
本帖最后由 sunzhiguolu 于 2015-09-05 15:06 编辑

回复 6# haooooaaa
   
$ more b
/_static/footer/AD/left_footer1.png

$ sed 's@.*/\(.*.png\)@\1@' b
left_footer1.png

大神,在上一个问题中我的表达有错误. 还请谅解! 我的意思是:
如何将一个完整的路径保存到捕获组中而不止是档案名称
.
大神,如何正确的将路径用一对 (/path/...Ext) (小括号)  进行捕捉呢?
还请大神指点...

   
作者: sunzhiguolu    时间: 2015-09-05 14:47
本帖最后由 sunzhiguolu 于 2015-09-05 15:00 编辑

回复 6# haooooaaa
如果使用楼上一位前辈给出的表达式,利用文本中特定字符进行定位期望捕获组存储的内容 (例如::),那么,
在路径中出现与正则中限定字符串位置的字符串相同的字符串该如何进行处理? 如下面的文本行:
... image:: /_static/... image:: /birthday_party.bmp


请大神指点,小弟先谢过...

   
作者: sunzhiguolu    时间: 2015-09-06 10:45
本帖最后由 sunzhiguolu 于 2015-09-06 10:47 编辑

回复 6# haooooaaa
如果使用楼上一位前辈给出的表达式,利用文本中特定字符进行定位期望捕获组存储的内容 (例如::),那么,
在路径中出现与正则中限定字符串位置的字符串相同的字符串该如何进行处理? 如下面的文本行:
... image:: /_static/... image:: /birthday_party.bmp

感谢您的上一次回复,多谢多谢... 小弟经常在此版块浏览大家的帖子,也经常看到您帮助他人时留下的身影,小弟非常敬佩您对知识的分享精神,对此将谢意一并送上. 当然这其中包括楼上的一位前辈 "聆雨淋夜".

   
作者: sunzhiguolu    时间: 2015-09-06 10:48
回复 4# 聆雨淋夜
感谢您的帮助,多谢多谢...

   
作者: haooooaaa    时间: 2015-09-06 10:51
回复 9# sunzhiguolu
  1. [root@test /tmp]$ echo "... image:: /_static/... image:: /birthday_party.bmp" | sed 's@.*:: \(.*\)@\1@'
  2. /birthday_party.bmp
复制代码
正则贪婪
作者: sunzhiguolu    时间: 2015-09-06 11:17
小弟对于此问题有一个不成熟的解决方法,但也是基于特定格式下字符串才能奏效. 并不能应对"产生的变化",也许这一点是很多人或者说大家感到不舒服的地方... 当然,我自己也包括其中. 如果您浏览到此帖内容,还请您给小弟指出问题所在或者指点思路. 小弟在此先谢过.  
示例代码如下:
  1. sed -r '
  2. /\bimage:: /{
  3. s/^.*\bimage:: (.*)$/![](\1)/1
  4. }' a
复制代码
以上的匹配替换同样是针对"特定字符串"来定位捕获组期望存储的内容,对于上面的问题只能做到有针对性的解决特定的问题. 例如:假设在文本行中有如下字符串,我的 s 操作符模式部分同样不能为捕获组正确的识别它起始存储的位置: 字符串如下:
... image:: ... image:: /_static/AD/help_me.jpg

原因是在路径前面的字串部分出现了两次 "image:: ",导致模式在进行匹配时错误的命中,也就影响到后面捕获组捕获的路径内容.

如果您找到问题所在,请您给小弟指点或是指出解决问题的思路. 在此我先向各位朋友道谢,多谢多谢...


作者: sunzhiguolu    时间: 2015-09-06 13:27
回复 11# haooooaaa
再次看到您的回复,首先一点:非常感谢您的无私帮助及对知识的分享精神. 的确,正如您在回帖中提到的 "正则贪婪",的确可以解决在路径中出现的 " image:: " 的问题,据您提醒写出如下所示代码:
  1. s/^.*?\bimage:: (.*)$/![](\1)/
复制代码
但是依旧是按照特字符串的格式写出符合某种特定要求的表达式,这种方式好像我上面提到的那样依旧不能应对变化,如我上一次回帖中提到的那个问题. 还请大神给予指点...  小弟拜谢...

   
作者: sunzhiguolu    时间: 2015-09-06 13:37
本帖最后由 sunzhiguolu 于 2015-09-06 13:38 编辑

如果哪位热心朋友找到问题所在,请您给予帮助或提供一个解决问题的思路. 在此小弟先谢过大家.
作者: 我爱你我的菜    时间: 2015-09-06 14:06
echo ".. image:: /_static/SimpleFactory.jpg"| sed 's/.. image:: \(.*\)/![](\1)/'
![](/_static/SimpleFactory.jpg)





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2