sed: регион с последующим номером - PullRequest
1 голос
/ 19 марта 2012

Рассмотрим следующую строку:

install --with-some-params some_pkg_name.10000
install --with-some-params other_pkg_name.10000
install --with-some-params yet_other_pkg_name.10000

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

sed 's/\(install --with-some-params some_pkg_name\.\)\([0-9]\{5\}\)/\1 10001/g'

Это действительно соответствует правой строке, но вводит ненужный пробел:

install --with-some-params some_pkg_name. 10001
                                         ^
install --with-some-params other_pkg_name.10000
install --with-some-params yet_other_pkg_name.10000

Но если я опускаю пробел в регулярном выражении, он соответствует региону \110001 вместо \1, за которым следует 10001.

Есть ли способ отделить 1 от 10001, не добавляя пробелы между ними в выводе?

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

Один из возможных обходных путей - убрать точку из группы:

sed 's/\(install --with-some-params some_pkg_name\)\.\([0-9]\{5\}\)/\1.10001/g'
1 голос
/ 19 марта 2012

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

perl -pe 's/(install --with-some-params some_pkg_name\.)(\d{5})/$1 . ($2+1)/e' infile

Результат:

install --with-some-params some_pkg_name.10001
install --with-some-params other_pkg_name.10000
install --with-some-params yet_other_pkg_name.10000

Флаг /e позволяет оценить запасную часть, увеличив номер версии до единицы.

0 голосов
/ 19 марта 2012

Другое решение - поместить то, что вы заменяете в одинарные кавычки так:

...