2016-09-27 167 views
0

所以我有一個下面一行文件中有特殊字符&我想用另一行替換它。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

回答

0

通過避免使用擴展正則表達式可以簡化,只有* 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。 –

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