sed FAQ (ЧАВО)

Q. Почему меняется не все, а только первое совпадение в строке?

A. По умолчанию. На самом деле, часто именно это и надо.

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

Подробнее про команду s в info sed.

Q. Как инвертировать RE, например найти все строки, где НЕТ строки «ABC»?

A. Никак. С помощью RE это сделать принципиально невозможно. Однако, sed так умеет: воспользуйтесь адресным выражением, например так:

sed '/ABC/ ! { необходимые команды }'

Найти несовпадение в пределах одной строки несколько сложнее, используйте маркёры.

Q. Почему выражение /.*XYZ/ работает не так, как мне хочется? (где тут не жадные выражения?)

Для повышения быстродействия все RE в sed жадные.

Однако, sed умеет выделять и с помощью не жадных квантификаторов. См. здесь.

Q. Почему не работает символьный класс [а-я]? Почему команда s/.*// не стирает все символы?

Это не баг, а фича. Подробнее см. здесь.

Q2. А что в маздае всё работало?

A2. Включите маздаевскую кодировку CP1251 (см. здесь), заработает и в Linux. Кроме Ё конечно, она и в маздае не работает. А вот если вы в своём маздае используете юникод, то будет работать прям как в любой нормальной ОС, т.е. - не работать.

Q. Почему команда sed -i редактирует файлы "только для чтения"?

Это тоже не баг, а фича. Подробнее см. здесь.

Q. Почему иногда срабатывает, а иногда не срабатывает команда перехода t?

Потому, что команда s только устанавливает флаг перехода, но его не сбрасывает. Подробнее см. здесь.

Q. Как обработать несколько строк сразу?

Вы уверенны, что хотите именно этого? Это возможно (см. пример), однако на практике намного лучше и быстрее сделать по другому: при необходимости подгрузить к имеющейся строке ещё одну, а если надо - вывести уже обработанную строчку, причём так, что-бы необработанный хвост продолжал обрабатываться. См. здесь.

Вы можете обсудить этот документ на форуме. Текст предоставляется по лицензии GNU Free Documentation License (Перевод лицензии GFDL).

Вы можете пожертвовать небольшую сумму яндекс-денег на счёт 41001666004238 для оплаты хостинга, интернета, и прочего. Это конечно добровольно, однако это намного улучшит данный документ (у меня будет больше времени для его улучшения). На самом деле, проект часто находится на грани закрытия, ибо никаких денег никогда не приносил, и приносить не будет. Вы можете мне помочь. Спасибо.