存在点和下划线时使用 sed 搜索和替换
Posted
技术标签:
【中文标题】存在点和下划线时使用 sed 搜索和替换【英文标题】:Search and replace with sed when dots and underscores are present 【发布时间】:2011-09-01 16:59:34 【问题描述】:如何替换 foo.用 foo_ 用 sed 简单地运行
sed 's/foo./foo_/g' file.php
不起作用。 谢谢!
【问题讨论】:
您能否向我们展示一些file.php
行,其中替换无法正常工作?
【参考方案1】:
转义.
:
sed 's/foo\./foo_/g' file.php
例子:
~$ cat test.txt
foo.bar
~$ sed 's/foo\./foo_/g' test.txt
foo_bar
【讨论】:
谢谢!..我不需要转义“foo”中的“”? 查看“正则表达式”部分的ed(1) 手册页,了解可以在表达式的左侧和右侧使用的内容。另外,请查看 regex(7) 了解 POSIX.2 正则表达式的说明。【参考方案2】:有趣的是,如果您只想搜索和替换点,则必须将点放入字符集中。由于某种原因,在 sed 命令中仅转义点是行不通的。点仍扩展为单个字符通配符。
$ bash --version # Ubuntu Lucid (10.04)
GNU bash,版本 4.1.5(1)-release (x86_64-pc-linux-gnu)
$ echo aa.bb.cc | sed s/\./-/g # replaces all characters with dash
'--------'
$ echo aa.bb.cc | sed s/[.]/-/g # replaces the dots with a dash
aa-bb-cc
通过在搜索中添加前导字符,转义有效。
$ echo foo. | sed s/foo\./foo_/g # works
foo_
将点放在字符集中当然也可以。
$ echo foo. | sed s/foo[.]/foo_/g # also works
foo_
-- 保罗
【讨论】:
您正试图用外壳转义点,因此 sed 将其视为“任何字符”。试试echo foo8 | sed s/foo\./foo_/g
,你仍然会得到foo_
。为防止被 shell 转义,请使用引号:echo aa.bb.cc | sed 's/\./-/g'
将给出 aa-bb-cc
;【参考方案3】:
就我自己而言,sed 's/foo\./foo_/g'
正在工作。不过你也可以试试:
sed -e 's/foo\./foo_/g'
和
sed -e "s/foo\\./foo_/g"
和
sed 's/foo[.]/foo_/g'
【讨论】:
【参考方案4】:用 \ 转义点
sed 's/foo\./foo_/g' file.php
如果您发现 / 和 \ 的组合令人困惑,您可以使用另一个“分隔符”字符
sed 's#foo\.#foo_#g
s 之后的第二个字符可以是任何字符,sed 将使用该字符作为分隔符。
【讨论】:
对sed
不熟悉,但在第二个示例中,最后一个/
真的有必要吗,其中#
用作分隔符?
@binaryLV:谢谢-不需要。【参考方案5】:
您需要转义点 - 未转义的点将匹配 foo 之后的任何字符。
sed 's/foo\./foo_/g'
【讨论】:
以上是关于存在点和下划线时使用 sed 搜索和替换的主要内容,如果未能解决你的问题,请参考以下文章