2016-08-12 2 views
0

У меня есть файл тест свойств с этим в нем:Свойства Файл с Sed регулярного выражением - Игнорировать первый символ для матча

-config.test=false 
config.test=false 

Я пытался, используя СЭД, обновлять значения этих свойств, имеют ли они - перед ними или нет. Первоначально я использовал это, который работал:

sed -i -e "s/#*\(config.test\)\s*=\s*\(.*\)/\1=$(echo "true" | sed -e 's/[\/&]/\\&/g')/" $FILE_NAME 

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

# The regex matches both of these 

config.test=true 
not.config.test=true 

Есть ли способ либо игнорировать первый символ на матч или игнорировать первоначальный - конкретно?

EDIT:

Добавление небольшого разъяснения в отношении того, что я хочу, чтобы регулярное выражение, чтобы соответствовать:

config.test=false  # Should match 
-config.test=false  # Should match 
not.config.test=false # Should NOT match 
+0

Добавьте '\ (^ \ | - \)' в начале шаблона. –

+0

Смотрите: [Часто задаваемые вопросы о регулярных выражениях переполнения стека] (http://stackoverflow.com/a/22944075/3776858) – Cyrus

ответ

1
sed -E 's/^(-?config\.test=).*/\1true/' file 

? означает zero or 1 repetitions of таким образом это означает, что - может присутствовать или нет при совпадении с регулярным выражением.

0

Я нашел решение для регулярного выражения конкретной длины вместо игнорирования первой характер с sed и awk. Иногда наоборот делает то же самое более простым способом.

Если у вас есть только альтернатива использованию sed, у меня есть два обходных пути в зависимости от вашего файла.

Если ваш файл выглядит следующим образом

$ cat file 
config.test=false 
-config.test=false 
not.config.test=false 

вы можете использовать этот Однострочник

sed 's/^\(.\{11,12\}=\)\(.*$\)/\1true/' file 

СЭД ищет в начале ^ каждой строки и группировке \(... \) для последующих назад ссылок каждого символ ., который встречается 11 или 12 раз \{11,12\}, за которым следует =.

Эта первая группа будет заменена обратной ссылкой \1.

Вторая группа, которая соответствует каждому персонажу после = до конца строки \(.*$\), будет удалена. Вместо второй группы sed заменяет нужную строку true.

Это также означает, что каждый символ после новой строки true будет нарезать.

Если вы хотите, чтобы избежать этого и ваш файл выглядит

$ cat file 
config.test=true  # Should match 
-config.test=true  # Should match 
not.config.test=false # Should NOT match 

вы можете использовать этот Однострочник

sed 's/^\(.\{11,12\}=\)\(false\)\(.*$\)/\1true\3/' file 

Это как пример раньше, но работает с тремя группами для обратной ссылки ,

Содержание первой группы 2 теперь находится в группе 3. Таким образом, контент после изменения с false до true не будет прерван.

Новая вторая группа \(false\) будет удалена и заменена на строку true.

Если ваш файл выглядит как в примере до и вам разрешено использовать AWK, вы можете попробовать это

awk -F'=' 'length($1)<=12 {sub(/false/,"true")};{print}' 

Для меня это выглядит гораздо более понятны, но это зависит от вашего решения.

В обоих примерах sed вы вызываете только один раз команду sed, которая всегда хороша.

Для первой команды sed требуется 39 и второй символ 50 для ввода. Команда awk требует ввода 52 символов.

Скажите, пожалуйста, если это работает для вас или вам нужно другое решение.

+0

Это изменит «бабочки = красивые» на «бабочки = истина». Всегда учитывайте ложные совпадения. –