Использование Sed для получения всех символов между открывающими и закрывающими - PullRequest
2 голосов
/ 29 декабря 2011

Я пытаюсь использовать sed, чтобы получить символы между открывающим и закрывающим.Эти открывающие и закрывающие символы могут быть фигурными скобками, например {и} и т. Д. В моем конкретном случае открывающий символ - =, а закрывающий символ - это конец строки.

В PHP у меня былрегулярное выражение, которое обычно работает для меня: ([^\^]*?).Однако, учитывая, что sed использует аромат POSIX-BRE, я не верю, что это сработает.

Строка, в которой я использую регулярное выражение, может выглядеть примерно так: password=mailPASSWORD.mailPASSWORD может содержать как обычные буквы алфавита, так и специальные символы.

Поэтому я хочу заменить mailPASSWORD и ввести свой собственный пароль.

sed -i -r "s/password[ ]*=[ ]*([pattern_goes_here])/password=mypassword/" /myfile

Буду признателен за помощь.

Заранее спасибо

РЕДАКТИРОВАТЬ

Изучив другие альтернативы sed, я обнаружил, что Perl на самом деле гораздо лучший инструмент для такого рода вещей.И поскольку мои знания о регулярных выражениях в значительной степени основаны на Perl, это выглядит как лучший путь.

Вот как я бы решил ту же проблему:

perl -p -i -e "s/password *= *[^\n]*/password=mypassword/" /myfile

Поскольку яделать вещи построчно, это просто делает сценарии намного проще.

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

С sed:

[jaypal:~] sed 's/\(.*[^=]=\)[[:alnum:]]\+/\1mypassword/' <<< password=mailPASSWORD
password=mypassword

С awk

[jaypal:~] awk -F"=" '{$2="mypassword";print $1"="$2}' <<<  password=mailPASSWORD
password=mypassword
2 голосов
/ 29 декабря 2011

Для вашего конкретного случая:

sed -i -r -e 's/password *= *[^\t ]*/password=mypassword/' /myfile

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

.*?x

с этим:

[^x]*x

Для многосимвольных конечных разделителей это усложняется, но это основная идея: вместо не жадного сопоставления создайте шаблон, который соответствует всем , но конечный разделитель.

0 голосов
/ 30 декабря 2011

Это может работать для вас:

echo 'someotherpassword=xxx password = mailPASSWORD_with_an_=_sign another=yyy' |
sed 's/^\(.*\<password\s*=\s*\)\S*/\1mypassword/' 
someotherpassword=xxx password = mypassword another=yyy

Если вы не хотите сохранять пробелы по обе стороны от знака =, тогда:

echo 'someotherpassword=xxx password = mailPASSWORD_with_an_=_sign another=yyy' |
sed 's/^\(.*\<password\)\s*=\s*\S*/\1=mypassword/' 
someotherpassword=xxx password=mypassword another=yyy

Еслистрока содержит только одно назначение пароля:

echo 'password = mailPASSWORD_with_an_=_sign' |
sed 's/\(=\s*\)\S*/\1mypassword/' 
password = mypassword

Или без пробелов:

echo 'password = mailPASSWORD_with_an_=_sign' |
sed 's/\s*=.*/=mypassword/' 
password=mypassword
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...