LINUX.ORG.RU
ФорумAdmin

почему sed отрабатывает не так как ожидаю

 ,


0

1

Всем привет.

Файл file1.txt такого содержания:

PKG_NAME=app124-0
PKG_INSTALLLOCATION='app124-0'
DIR='Example 124.0'

Хочу через sed изменить его содержимое 124.0 на 124.1 Пишу

sed 's/124.0/124.1/g' file1.txt

и sed поменял мне всё и 124-0 тоже захватил.

PKG_NAME=app124.1
PKG_INSTALLLOCATION='app124.1'
DIR='Example 124.1'

По итогу мне нужно будет поменять как 124-0 на 124-1, а 124.0 на 124.1 во многих файлах.

Почему так происходит и где ошибаюсь? Как поменять только то, что указал одной командой? Заранее спасибо

Перемещено hobbit из general

Добрые люди дали тебе рыбы.

Хочешь, я дам тебе удочку?

Во-первых, читай man sed.

Во-вторых, следуй совету в конце мана и читай info sed, так как у гнушных программ ман часто ущербный. Например: в man sed регулярные выражения не описаны, а в info sed — полная документация, включая доки на регулярки. В частности, читай раздел «5 Regular Expressions: selecting text».

В-третьих, гуглить «BRE» (basic regular expressions) и «ERE» (extended regular expressions) можно, но осторожно: или найдёшь какое-нибудь устаревшее описание, либо наоборот, слишком новое, не соответвующее седу, установленному в твоей системе. Впрочем, это касается всех утилит.

В-четвёртых, чтоб не путаться в BRE и ERE, всегда используй ERE, т. е. запускай sed с опцией -E.

В-пятых, чтоб не изучать кучу тулзов: sed, grep, awk и многие другие, лучше один раз пройдись по перлу, который заруливает из всех, вместе взятых. Регулярки в перле — зе бест, после опыта работы с ними возвращаться к BRE — тоска зелёная.

Если ты дойдёшь до пятого пункта, у тебя будет уже не удочка, а лодка с мотором и комплект сетей. А если не дойдёшь даже до первого, то так и будешь ключи подавать.

debugger ★★★★★
()
Ответ на: комментарий от debugger

Никакой рыбы никто никому не давал, только показали правильный взмах удочкой. А если перл учить, то недолго докатиться до самодельной мебели и бензина из одуванчиков.

Irma ★★
()
Ответ на: комментарий от Irma

Ты хоть поинтересуйся у ТС, знает ли он, что такое «метасимвол». Походу, он у Всеволода готовую строчку скопировал — а это и есть та самая метафорическая рыба в чистейшем виде.

debugger ★★★★★
()
Ответ на: комментарий от Vsevolod-linuxoid

Вот так пиши

Можно позанудствовать? Думается мне что экранировать ‘.’ второй раз (в секции «to») - излишне. Хотя по факту (и к моему некоторому удивлению, должен заметить) - оба варианта отрабатывают «правильно».

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Думается мне что экранировать ‘.’ второй раз (в секции «to») - излишне.

Да, там точка — это просто точка. Думаю, там кроме ссылок на группы и разделителя команды нет никаких специальных символов.

anonymous
()
Ответ на: комментарий от anonymous

Думаю, там кроме ссылок на группы и разделителя команды нет никаких специальных символов.

Я пока не до конца понимаю куда там back-slash исчезает, и зачем так сделали. Ну да ладно…

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Независимо от причин, почему так сделали, это поведение зафиксировано в POSIX. Можно предположить, что изначально так сделали для простоты.

anonymous
()

Вообще зависит от sed и ключиков с которыми он запущен. Но в вашем случае видимо нужен обратный слэш перед первой точкой s/124\.0/124.1/g

anc ★★★★★
()