LINUX.ORG.RU

[sed] global, все вхождения

 


0

1

Собственно вопрос, сделал на файлах с одинаковым содержанием:

sed -i 's|/local||' READMEcp
и
sed -i 's|/local||g' README
получил один и тот же результат, хотя 1 должен, как я всегда думал, удалить только одно найденное, а не все (g, т.е. global) или все не так и имеется в виду для седа последняя команда, как все вхождений в одной строке, но по всему файлу?

★★★★★

sed - строчный редактор, у него объект приложения сил - строка, а не файл. Параметр g можно посмотреть в мане, а там написано Copy/append hold space to pattern space.

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

Лучше читать «info sed». Там чётко написано, что команда s имеет такой формат:

`s/REGEXP/REPLACEMENT/FLAGS'

А флаги могут быть разные, не только 'p' и 'g', но и другие, например 'число':

echo -e '12121212\n1213' | sed 's/12/**/3'

mky ★★★★★
()

Ага, спасибо, но в принципе так и думал.

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

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

Ну вот у меня такой вариант:

sed 's|/local|--|;tc;b;:c;n;bc;'

Наверно, может можно проще, но пока не придумал.

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

Да уж, спасибо

Кстати, а по сути, не пойму, что с ключем -e, что с -i или даже без них, тоже самое получается, в чем разница?

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

Может я и не совсем прав, но опции -e позволяют задать несколько команд sed'а. Вроде это тоже самое, что перечислять из через ";", но позволяет более чётко отделить блоки.

Кстати, в sed faq дан более изящный вариант решения вашей задачи. Я там наворотил цикл, а можно было просто:

sed -e '1s/\/local/--/;t' -e '1,/\/local/s//--/'

То есть для первой строки s-выражение и выход, если совпало. Для остальных строк задан диапазон строк от первой до (запятая) совпадения с регулярным выражением. GNU sed позволяет это записать короче:

sed '0,/\/local/s//--/'

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.