sed命令替换一个特殊字符的字符串

问题描述:

所以我有一个下面一行文件中有特殊字符&我想用另一行替换它。sed命令替换一个特殊字符的字符串

目前Line在文件 -

'generic_raid': {'keys': 5 * (1000**3) 

线与我想要替换上述线 -

'generic_raid': {'keys': 2 

我使用下面的sed命令,但它不工作,任何人都可以请帮助

sudo sed -r -i "s/'generic_raid': \{'keys': 5 * (1000**3)/'generic_raid': \{'keys': 2/g" abc.py 
+3

逃生大括号,*,(,) –

+0

非常感谢阿维纳什,它的工作。我使用了下面的命令 - sudo sed -r -i“s /'generic_raid':\ {'keys':5 \ * \(1000 \ * \ * 3 \)/'generic_raid':\ {'keys':2/g“abc.py –

+1

如果你不确定是否需要转义某些东西,可以将一个字符放在方括号中。 '[*]'匹配'*','[{]'匹配'{'等等。 – ghoti

通过避免使用扩展正则表达式可以简化,只有* nee DS到在这种情况下

$ cat ip.txt 
'generic_raid': {'keys': 5 * (1000**3) 
$ sed "s/'generic_raid': {'keys': 5 \* (1000\*\*3)/'generic_raid': {'keys': 2/g" ip.txt 
'generic_raid': {'keys': 2 

在这种情况下,不需要进行转义的,但如果"是不希望的,在图案'特征,ASCII码\x27可用于

$ sed 's/\x27generic_raid\x27: {\x27keys\x27: 5 \* (1000\*\*3)/\x27generic_raid\x27: {\x27keys\x27: 2/g' ip.txt 
'generic_raid': {'keys': 2 

此外,perl溶液有\Q功能在这些情况下有所帮助:

$ perl -pe "s/\Q'generic_raid': {'keys': 5 * (1000**3)/'generic_raid': {'keys': 2/" ip.txt 
'generic_raid': {'keys': 2 

perldoc

返回EXPR值,所有ASCII非“字”字符 反斜杠。 (也就是说,所有ASCII字符不匹配 /[A-ZA-z_0-9] /将由反斜杠返回字符串中之前, 不管任何区域设置。)

+0

总是使用八进制'\ 047',而不是十六进制'\ x27'来表示单引号。请参阅http://awk.freeshell.org/PrintASingleQuote。 YMMV,当然也可以。 –

+0

@EdMorton会影响'sed'吗?并没有影响我'GNU sed 4.2.2' – Sundeep

+0

你知道我不确定。我是这么认为的,但我总是使用'''''和sed这样的idk。 –

由于

SED没有按”没有任何字符串操作,需要很多工作来强制sed表达式像使用字符串一样工作(请参阅Is it possible to escape regex metacharacters reliably with sed),所以不需要。因为它支持的字符串操作,而是用awk:

awk -v old="'generic_raid': {'keys': 5 * (1000**3)" \ 
    -v new="'generic_raid': {'keys': 2" \ 
     's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' file 
'generic_raid': {'keys': 2