Пустые пространства, захватывающие с помощью sed - PullRequest
0 голосов
/ 07 марта 2012

Мне нужна помощь с подстановкой в ​​регулярное выражение sed.

Из следующей строки:

Provides          mysql                

Я хочу получить:

Provides          mysql-5.5                

Лучшее решение, которое ябыл в состоянии прийти с:

sed -i "s/\(Provides\)\(\s\)*\(mysql\)/\1\2mysql-5.5/g" my_file_containing_the_line

, но результат не так, как я хочу:

Provides mysql-5.5                

Что не идеально, потому что я потерял пробелы между "Обеспечивает" и "mysql-5.5 "

Спасибо

Ответы [ 3 ]

4 голосов
/ 07 марта 2012
"s/\(Provides\)\(\s\)*\(mysql\)/\1\2mysql-5.5/g"

\2 группа не содержит все пробелы

"s/\(Provides\)\(\s*\)\(mysql\)/\1\2mysql-5.5/g" будет работать.

$> echo "Provides          mysql" | sed "s/\(Provides\)\(\s*\)\(mysql\)/\1\2mysql-5.5/g"
Provides          mysql-5.5

Кроме того, вы можете использовать опцию --regexp-extended для подавления избыточного экранирования:

$> echo "Provides          mysql" | sed --regexp-extended "s/(Provides)(\s*)(mysql)/\1\2mysql-5.5/g"
Provides          mysql-5.5

Или даже

$> echo "Provides          mysql" | sed --regexp-extended "s/(Provides\s*)(mysql)/\1\2-5.5/g"
Provides          mysql-5.5
4 голосов
/ 07 марта 2012

Измените это:

\(\s\)*

на это:

\(\s*\)

, чтобы группа захвата содержала все \s* вместо одного \s.(При \(\s\)* группа захвата заканчивается только последним символом пробела.)

На самом деле, вы можете объединить все группы захвата и написать:

sed -i 's/\(Provides\s*\)mysql/\1mysql-5.5/g' my_file_containing_the_line

или:

sed -i 's/\(Provides\s*mysql\)/\1-5.5/g' my_file_containing_the_line
0 голосов
/ 07 марта 2012

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

echo "Provides          mysql                " | sed '/^Provides/s/mysql/&-5.5/'
Provides          mysql-5.5
...