所以我在一个具有特殊字符和文件的文件中有一行。我想用另一条线替换它。
文件中的行 -
'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
答案 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