замена строки с помощью SED не работает - PullRequest
1 голос
/ 08 февраля 2012

Рассмотрим эту строку:

--dump-config=h264_sss-l2-2-ghb-16-500.ini --stats-file=h264_sss-l2-2-ghb-16-500.stat configs/example/cmp.py --l2cache -b h264_sss

и эта строка "l2-2-ghb-16". Чтобы изменить эту строку с помощью SED, я запустил эту команду:

sed  's/l2-.*-.*-.*-/l2-2-ghb-8-m-/g'

Но тогда вся строка изменилась на

--dump-config=h264_sss-l2-2-ghb-8-m-b h264_sss

В чем проблема

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Часть .* соответствует максимально длинному отрезку символов, который может заставить шаблон работать. Таким образом, первое .* не соответствует просто 2, как вы надеетесь, но 2-ghb-16-500.ini --stats-file=h264_sss-l2-2-ghb-16 и так далее. Чтобы заставить его работать, замените точки на [^-] (любой не штриховой символ). Таким образом,

sed  's/l2-[^-]*-[^-]*-[^-]*-/l2-2-ghb-8-m-/g'
2 голосов
/ 08 февраля 2012

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

Это означает, что оно будет пытаться вытянуть совпадение из того, что вы думаю, - это первый шаблон на всем пути к тому, что вы считаете вторым.

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

Быстрое исправление состоит в том, чтобы убедиться, что он не соответствует следующему - символу с чем-то вроде:

sed  's/l2-[^-]*-[^-]*-[^-]*-/l2-2-ghb-8-m-/g'

согласно следующемурасшифровка:

pax> echo '--dump-config=h264_sss-l2-2-ghb-16-500.ini  --stats-file=h264_sss-l2-2-ghb-16-500.stat  configs/example/cmp.py --l2cache -b h264_sss' | sed 's/l2-[^-]*-[^-]*-[^-]*-/l2-2-ghb-8-m-/g'
           --dump-config=h264_sss-l2-2-ghb-8-m-500.ini --stats-file=h264_sss-l2-2-ghb-8-m-500.stat configs/example/cmp.py --l2cache -b h264_sss

(команда и вывод немного изменены, выстроены в ряд, чтобы вы могли легко видеть преобразования).

Это работает, потому что, хотя .* говорит самое большое поле любогосимволов, [^-]* говорит о наибольшем поле из любых символов , за исключением -.

0 голосов
/ 08 февраля 2012

sed ищет максимально возможное совпадение.Так что -.*- будет соответствовать строке как можно большего размера.

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