模式匹配并使用sed

时间:2016-01-15 17:34:18

标签: regex linux shell sed pattern-matching

我有一个包含以下内容的文本文件:

First link https://cdn.shopify.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_f304e840-bb1d-4bcf-a993-d966c0b99ae3.jpeg?v=1452842355 
Second link https://cdn.shopify.com/s/files/1/0151/0741/products/549542c704da78a0e5208b9f8c2cd26e.jpeg?v=1452842263
Third link https://cdn.shopify.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_70e7e6b9-bedd-40a7-b322-542facf94c05.jpeg?v=1452842230
Fourth link https://cdn.shopify.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_5485fd04-c852-4fd7-b142-92595329568a.jpeg?v=1452841841
lst link https://cdn.shopify.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_fb613b45-fbbb-4b6d-b9c0-45d7f069879e.jpeg?v=1452841831

我希望匹配最后一个网址,并使用sed在该行的开头或结尾添加一个单词。

但它不起作用。帮助

命令输出会出现此错误。

$sed -e 's_https://cdn.shopify.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_f304e840-bb1d-4bcf-a993-d966c0b99ae3.jpeg\?v=1452842355 .*_& NOTFOUND_'
sed: -e expression #1, char 148: unknown option to `s'

3 个答案:

答案 0 :(得分:3)

不幸的是sed不是此任务的最佳工具。你无法在sed模式中传递普通的非正则表达式字符串,而无需事先进行所有的转义。

最好使用awk

awk 'index($0, "https://cdn.shopify.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_fb613b45-fbbb-4b6d-b9c0-45d7f069879e.jpeg?v=1452841831"){
 $0 = $0 " NOTFOUND"} 1' file

index函数刚刚在记录中搜索了给定URL的存在,如果找到,则在末尾附加" NOTFOUND字符串。

等效的工作sed将是这样的:

sed 's~https://cdn\.shopify\.com/s/files/1/0151/0741/products/2c60070615ceaa44c934ca876fe4ccc0_fb613b45-fbbb-4b6d-b9c0-45d7f069879e\.jpeg?v=1452841831.*~& NOTFOUND~' file

正如您所看到的,它要求您转义所有DOT并选择一个尚未出现在输入字符串中的正则表达式分隔符。

答案 1 :(得分:2)

为什么你使用_作为你的正则表达式分隔符,当这个字符显示在URL中时?

[..snip..]/products/2c60070615ceaa44c934ca876fe4ccc0_fb613b45-fb
                                                    ^---

你有效地做了

s/.../f

fs/正则表达式的未知修饰符。

答案 2 :(得分:1)

模式有一个下划线...fe4ccc0_f304...,您可以将其用作替换命令的分隔符。使用一些在模式或替换字符串中看起来没有转义的其他分隔符。

请尝试使用|字符,例如s|http://... .*$|& NOT_FOUND|