Linux 如何为sed转义某些字符?

Linux 如何为sed转义某些字符?,linux,sed,Linux,Sed,我想从文件中删除一行,并理解这可以通过sed完成 下面的命令失败,因为未终止的地址regex sed -i '/$settings['file_temp_path'] = '../tmp';/d' file.php 在读了答案之后,我马上回答了问题。我现在明白这是因为字符[和/必须转义] 尝试此操作后,下面的代码仍然不成功 sed -i '/$settings\['file_temp_path'] = '..\/tmp';/d' file.php 这有什么问题?我遗漏了什么?您需要转义模式中

我想从文件中删除一行,并理解这可以通过sed完成

下面的命令失败,因为未终止的地址regex

sed -i '/$settings['file_temp_path'] = '../tmp';/d' file.php
在读了答案之后,我马上回答了问题。我现在明白这是因为字符[和/必须转义]

尝试此操作后,下面的代码仍然不成功

sed -i '/$settings\['file_temp_path'] = '..\/tmp';/d' file.php

这有什么问题?我遗漏了什么?

您需要转义模式中的几个特殊字符,包括
$

file.php的内容示例:

foo
$settings['file_temp_path'] = '../tmp';
bar
示例代码:

$ sed -i "s/\$settings\['file_temp_path'\] = '..\/tmp';//" file.php                                                                        
$ cat file.php
foo

bar
这可能适用于您(GNU-sed):

当regexp/replacement包含匹配分隔符时(通常
/
),它可以转义/引用,也可以更改分隔符,即
/\/tmp/
\\\\\/tmp\\\
。注意,在替换命令
s/\/tmp/replacement/
的情况下,也可以是
s\/tmp\\\\\
,并且前导分隔符不需要转义/引用

元字符,即
^
$
[
*
\
&
必须由
\
转义/引用,或放在字符类中,例如
应为
\.

根据经验,sed命令应该用单引号括起来,对于要包含在regexp中的单引号,它们应该替换为关闭现有命令的
\''
,shell转义/引用a
'
,然后重新打开下一个sed命令

也可以使用双引号
,但可能会产生意外的副作用,因为它们对shell插值开放


注意:如果将regexp/替换定界符放在字符类中,则不需要对其进行转义/引用,即如果
/
是定界符,则
[/]
\/
相同。另外请注意,
{
}
|
+
如果要表示其文字值,则不应转义/引用它们,除非调用了
-E
-r
sed wh命令行选项,在这种情况下,它们应该是,即
+
表示加号,就像调用
-E
时一样调用
-E
-r
时,
\+
+
表示前面的一个或多个字符/组。

要删除的行是什么样子?$settings['file\u temp\u path']='../tmp';谢谢。我发现这会打印整个文件,并且我确实看到正确的行已被删除,并且保留了一个空行空间。但是在查看文件内容时,我发现该行仍然存在。是否需要另一个步骤来保存更改?是的,您需要使用
-I
标志。我没有包括它,因为我想如何编辑输出..让我来编辑。如果您对我的答案满意,请参见此处所做的操作:因此需要添加一些内容。除文件名外的所有内容都包含在“”中,然后是$,[,],和/必须使用/。s/开头和//结尾的目的是什么?这只是替换的
sed
语法。您不应该对我的代码进行任何更改
sed -i '\#\$settings\['\''file_temp_path'\''\] = '\''\.\./tmp'\'';#d' file