LINUX.ORG.RU

[ненависть]sed: заменить строки

 


0

0

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

Засада в том, что sed рассматривает выражение как регулярное. Поэтому надо как-то экранировать всё, что нужно экранировать для sed'а.

В принципе на sed'е свет клином не сошёлся, но нужно, чтобы эта хрень работала и в cygwin'e и в unix'ах разного рода.

В идела подходит rpl или какой-нибудь replace, но первый не везде есть, а второй вообще из mysql-комплекта. 'sh -c' как-то странно себя ведёт с входными аргументами.

В принципе на sed можно изобразить что-то, отдалённо работающее, но выглядит это ,мягко говоря, кривовато и без поллитра там не разберёшься.

но ЁПРСТ - всё это нужно чтобы заменить одну последовательность символов на другую буквально!!!!! HATE HATE HATE !!!!!

У меня уже появляются мысли тупо внедрить в процесс сборки свою утилиту на C, благо gcc в наличии =).

Есть мысли, как это сделать попрямее?

★★

Ответ на: комментарий от DRVTiny

во первых это башизм.

во вторых, ты вопрос прочел? у него STR1 и STR2 поступают из внешних источников — значит в твоем варианте их нужно санировать

dilmah ★★★★★
()

проще всего в ./configure вставить проверку на replace

если есть перл, то у него в регекспе любой заэкскейпленный слэшом символ (кроме букв цифр и возможно пробелов) означает сам себя, так что в 3 строки можно написать

www_linux_org_ru ★★★★★
()

wtf is «внешний источник»? как он выглядит и чем его можно пощупать?

arsi ★★★★★
()

м.б., и sed-у можно вначале тупо заменить все не-альфа-нум-пробелы на \символ, а потом полученное рег. выражение использовать? (никогда сед не юзаю, всегда перл)

www_linux_org_ru ★★★★★
()

>У меня уже появляются мысли тупо внедрить в процесс сборки свою утилиту на C,

Тогда уж возмите replace из mysql, он уже на Си.

Или, как уже посоветовали, сначала пропускайте исходые строки через sed 's///'.

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