存在点和下划线时使用 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 搜索和替换的主要内容,如果未能解决你的问题,请参考以下文章

shell sed 问题

在 CodeIgniter 中更改上传文件的名称(点和下划线)

用 sed 对数字进行分组:下划线对我不起作用

shell基础应用(五)

shell中 sed或awk 把文件的两个字段调换位置

awk/sed 脚本将文件从驼峰式转换为下划线