【问题标题】:sed replace filename starts with quotesed 替换文件名以引号开头
【发布时间】:2015-07-10 16:24:59
【问题描述】:
我在文件字符串中有 img src="../image/popup.jpg" 或 bg: 'images/xxx/popup.png'。我想用另一个带有 sed 的字符串替换整个文件路径/名称,我试过了
sed 's/^"[^\s]*/somethingelse/g'
【问题讨论】:
标签:
regex
linux
string
replace
sed
【解决方案1】:
试试这个,
sed 's|/some/UNIX/path|/a/new/path|g' files
【解决方案2】:
当使用 sed 替换路径名时,更改其默认分隔符会有所帮助,正如 Skynet 所指出的,并且明智地使用单引号允许像这样的变量插值:
> a="\"hello/bye\""
> b="\"one/two\""
> echo $a
"hello/bye"
> echo $b
"one/two"
> echo $a|sed -e 's|'$a'|'$b'|'
"one/two"
来自http://linux.die.net/man/1/sed sed 不支持 POSIX。 2个基本的正则表达式“完全是因为性能问题”,但是它很接近。根据http://www.regular-expressions.info/posix.html,POSIX 正则表达式的规则之一是“使用反斜杠转义绝不是元字符的字符是错误的”。由于双引号和单引号不是元字符,因此不应根据此在 POSIX 正则表达式中使用反斜杠。
【解决方案3】:
将sed 与 BRE 一起使用:
sed "s/\([\"']\)[^\"']*\([\"']\)/\1somethingelse\2/g" file
使用 ERE:
sed -r "s/([\"'])[^\"']*([\"'])/\1somethingelse\2/g" file
假设文件名中没有转义引号,即 "..." 和 '...' 中没有引号