使用sed将字符串匹配正则表达式替换为通配符

时间:2015-11-22 22:12:01

标签: regex bash sed

我有一个字符串,我正在尝试用sed操作

js/plex.js?hash=f1c2b98&version=2.4.23"

所需的输出

js/plex.js"

这就是我目前正在尝试的

sed -i s'/js\/plex.js[\?.\+\"]/js\/plex.js"/'

但它只匹配第一个?并返回此输出

js/plex.js"hash=f1c2b98&version=2.4.23"

我看不出为什么几个小时之后它无法正常工作

2 个答案:

答案 0 :(得分:1)

这有效

echo 'js/plex.js?hash=f1c2b98&version=2.4.23"' | sed  s:.js?.*:.js:g

使用原始正则表达式:

首先,我建议在正则表达式中使用/时在sed中使用不同的分隔符(如:。其次,使用[]表示您匹配字符在括号内(因此它不会将.+扩展到该行的末尾 - 您可以尝试将+放在[]之后)

答案 1 :(得分:1)

也许

sed 's#\(js/plex.js?\)[^"]\+".*#\1#g'

...

\# is used as a delimiter

\(js/plex.js?\)[^"]\+".* #find此模式,并使用已标记的模式\1替换所有内容

标记的模式

在sed中,您可以使用\( \)标记模式的一部分或整个模式。 。

当一个模式的一部分被括号()括起来被反斜杠转义时......模式被标记/存储......

在我的例子中,这是我的模式没有标记

js/plex.js?[^"]\+".*

但我只想让sed记住js/plex.js?,并用仅仅js/plex.js?这个模式替换整行。用第一个标记的模式称为\1,第二个\2等等

\(js/plex.js?\) ---> is marked as \1

因此我用\1

替换整行