Sed命令用于替换具有特殊字符的字符串

时间:2016-09-27 15:03:53

标签: bash sed

所以我在一个具有特殊字符和文件的文件中有一行。我想用另一条线替换它。

文件中的行 -

'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

2 个答案:

答案 0 :(得分:0)

通过避免使用扩展正则表达式可以简化

,在这种情况下只需要转义*

$ 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

  

返回所有ASCII非“word”字符的EXPR值   反斜杠。 (也就是说,所有ASCII字符都不匹配   / [A-Za-z_0-9] /将在返回的字符串中加一个反斜杠,   无论任何语言环境设置如何。)

答案 1 :(得分:0)

由于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