2016-09-27 3 views
0

Итак, у меня есть следующая строка в файле, который имеет специальные символы & Я хочу заменить его другой строкой.Команда Sed для замены строки специальным символом

линия присутствует в файле -

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

линии, с которой я хочу, чтобы заменить выше line-

'generic_raid': {'keys': 2 

Я использую ниже команду, но патч в это не работает, может кто-нибудь пожалуйста помочь

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

можно упростить, избегая использования расширенного регулярного выражения, только * урожденная 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 с либо в sed, конечно. –

+0

@EdMorton влияет на 'sed'? не повлиял на меня на 'GNU sed 4.2.2' – Sundeep

+0

Знаешь, я не уверен. Я предположил так, но я всегда использую '' \ '' 'с sed so idk. –

0

Поскольку СЭД Безразлично» t есть какие-либо операции с строками, требуется большая работа, чтобы заставить 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 
Смежные вопросы