2016-11-03 4 views
0

У меня есть текстовый файл с именем package.json, который содержит следующую Snippit:Баш SED замена текста с регулярным выражением

"single-instance":true, 
    "user-agent": "somename", 
    "PORT": 2000, 

Мне нужно заменить «SomeName» с другим значением (в данном случае ххх) и «SomeName 'не фиксирован, это может быть что угодно.

Так что я попытался использовать следующее регулярное выражение, однако оно не обновляет файл.

Я проверил выражение регулярного выражения на regex101, и он кажется действительным, поэтому я думаю, что это должно быть что-то делать с синтаксисом sed ??

sed -i 's/"user-agent": "(.*)"/xxx/' package.json 

Любые предложения о том, куда я иду не так?

+0

к сведению, что по умолчанию SED использует BRE, где '()' не метасимволы ... вы должны использовать '\ (\)' или активировать ERE с параметром '-E' или' -r' от sed. См. Http://www.regular-expressions.info/posix.html для BRE/ERE – Sundeep

ответ

0

Вы должны захватить совпадающий ключ и использовать обратную ссылку на замену:

sed -i.bak -E 's/("user-agent":)"[^"]*"/\1"xxx"/' file 

cat file 

"single-instance":true, 
"user-agent": "xxx", 
"PORT": 2000, 

принять к сведению ( и ) вокруг "user-agent": для захвата значения в группе # 1 и использовать \1 в замене.

+1

Большое спасибо, я кое-что узнал :-) – crankshaft

+0

Рад знать [вы можете пометить ответ как принятый, щелкнув по галочке отметки ** в левом верхнем углу этого ответа] (http://meta.stackexchange.com/a/5235/160242) – anubhava

0

вы могли бы попробовать это после резервного копирования package.json

sed -i -re 's/("user-agent":).*$/\1 "xxx"/' package.json 
Смежные вопросы