sed для редактирования строки в файле - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть значение строки, которое мне нужно обновить в файле,

export const ADDRESS_ORIGIN = 'chupa-cabra.muz.id';

Я пытаюсь обновить с помощью:

sed -i '' 's/ADDRESS_ORIGIN ="[0-9.]*"/ADDRESS_ORIGIN ="'chapuza'"/' constants.js

Но значение для

ADDRESS_ORIGIN

Не обновляется, я думаю, что мой REGEX очень неправильный, как я могу обновить значение?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Я предполагаю, что вы находитесь на macOS из-за того, как вы используете редактирование на месте; это должно работать :

sed -E -i '' "s@(ADDRESS_ORIGIN = )'.*'@\1'chapuza'@g"

Результат :

export const ADDRESS_ORIGIN = 'chapuza';
0 голосов
/ 14 февраля 2019

Зачем это нужно?
Вы пропустили пробел после знака равенства, и двойные кавычки " будут буквально совпадать с двойными кавычками, а не с одинарными кавычками ', а [0-9.]* будут совпадать с последовательными цифрами и точками.

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

sed 's/ADDRESS_ORIGIN *= *\x27[^\x27]*\x27/ADDRESS_ORIGIN = \x27chapuza\x27/'

или

sed 's/\(ADDRESS_ORIGIN\) *= *\x27[^\x27]*\x27/\1 = \x27chapuza\x27/'

Или, что еще лучше, поскольку могут быть двойные кавычкиВокруг значения вы можете рассмотреть обе ситуации следующим образом:

sed -E 's/(ADDRESS_ORIGIN) *= *([\x27\x22])[^\039\034]*\2/\1 = \x27chapuza\x27/'

Где \x27 = \039 = ', \x22 = \034 = " в RegEX.

Как это:

$ echo export const ADDRESS_ORIGIN = \"chupa-cabra.muz.id\"\;|sed -E 's/(ADDRESS_ORIGIN) *= *([\x27\x22])[^\039\034]*\2/\1 = \x27chapuza\x27/'
export const ADDRESS_ORIGIN = 'chapuza';
0 голосов
/ 14 февраля 2019

Нет способа, которым "[0-9.]*" может соответствовать 'chupa-cabra.muz.id', но, не зная, как выглядят допустимые значения, мы можем только строить догадки.Возможно, '[^']*' будет делать то, что вы хотите, хотя вам нужно понимать механизмы цитирования оболочки, чтобы правильно добраться до sed.В данном конкретном случае самым простым на сегодняшний день является использование двойных кавычек вокруг сценария sed вместо одиночного:

sed -i '' "s/ADDRESS_ORIGIN = *'[^']*'/ADDRESS_ORIGIN = 'chapuza'/" constants.js

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

sed -i '' 's/ADDRESS_ORIGIN = *'"'[^']*'"'/ADDRESS_ORIGIN = '"'chapuza'/" constants.js

Основной механизм здесь заключается в том, что соседние строки будут склеены оболочкой в ​​одну строку.Таким образом, "a"'b' - это двойная кавычка a, за которой следует одинарная кавычка b.После того, как оболочка выполнит ее синтаксический анализ, вы получите строку ab.А теперь представьте себе, что a - это буквальная одинарная кавычка, а b - это буквальная двойная кавычка.

... Или, возможно, вы хотите заменить только первый токен перед точкой?Тогда '[^.']*\. будет соответствовать, и вы захотите заменить на 'chapuza. Или использовать обратную ссылку '[^.']*\(['.]\) и заменить на 'chapuza\1

В общем случае, конечно, двойные кавычки имеют различную семантикучем одиночный, поэтому, если в вашем скрипте используются символы, которые будут искажены оболочкой при переключении кавычек, вам необходимо добавить обратную косую черту перед ними или переключиться на механизм «квотирования на качелях», который я описал выше.Но в этом конкретном случае ваш пример сценария не требует каких-либо изменений для адаптации к двойным кавычкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...