我有一个字符串,我正在尝试用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"
我看不出为什么几个小时之后它无法正常工作
答案 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