当存在点和下划线时,搜索并替换为sed

alg*_*der 25 linux command-line sed

我该如何替换foo.用foo_与sed简单地运行

sed 's/foo./foo_/g' file.php
Run Code Online (Sandbox Code Playgroud)

不起作用.谢谢!

rid*_*rid 26

逃离.:

sed 's/foo\./foo_/g' file.php

例:

~$ cat test.txt 
foo.bar
~$ sed 's/foo\./foo_/g' test.txt 
foo_bar
Run Code Online (Sandbox Code Playgroud)


Pau*_*l S 14

有趣的是,如果您只想搜索并替换点,则必须将点放在字符集中.出于某种原因,仅在sed命令中单独转义点不起作用.点仍然扩展为单个字符外卡.

$ bash --version  # Ubuntu Lucid (10.04)
Run Code Online (Sandbox Code Playgroud)

GNU bash,版本4.1.5(1)-release(x86_64-pc-linux-gnu)

$ echo aa.bb.cc | sed s/\./-/g  # replaces all characters with dash
Run Code Online (Sandbox Code Playgroud)

'--------'

$ echo aa.bb.cc | sed s/[.]/-/g  # replaces the dots with a dash
Run Code Online (Sandbox Code Playgroud)

AA-BB-CC

通过在搜索中添加前导字符,逃脱工作.

$ echo foo. | sed s/foo\./foo_/g  # works
Run Code Online (Sandbox Code Playgroud)

foo_

将点放在字符集当然也有效.

$ echo foo. | sed s/foo[.]/foo_/g  # also works
Run Code Online (Sandbox Code Playgroud)

foo_

- 保罗

  • 你试图用shell来逃避点,所以sed将它视为"任何角色".试试`echo foo8 | sed s/foo\./ foo_/g`你仍然得到`foo_`.要防止shell转义,请使用引号:`echo aa.bb.cc | sed's /\ ./-/g'`将给'aa-bb-cc`; (2认同)

sas*_*ang 6

用一个\逃脱点

sed 's/foo\./foo_/g' file.php
Run Code Online (Sandbox Code Playgroud)

如果您发现/和\ confusing的组合,您可以使用另一个'分隔符'字符

sed 's#foo\.#foo_#g
Run Code Online (Sandbox Code Playgroud)

s之后的第二个字符可以是任何东西,sed将使用该字符作为分隔符.


Aug*_*rom 5

您需要对点进行转义 - 未转义的点将匹配 foo 之后的任何字符。

sed 's/foo\./foo_/g'
Run Code Online (Sandbox Code Playgroud)