LINUX.ORG.RU

sed без регулярных выражений


0

1

Вероятно, уже многократно задаваемый вопрос, но если бы я нашел ответ, я бы не спрашивал. Как мне заставить работать sed без регулярных выражений?

pete@crunchbang:/usr/local/bin$ echo 'также'|sed 's/т.к./because/g'
becauseе
А мне нужно, чтобы точка интерпретировалась как точка.

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

И еще одно дополнение. Для замены используется команда

sed -i "s/$orig/$transl/g" "$tmpfile"
, поэтому переменные не должны пострадать.

Deleted

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

какая стоит задача?

В одном файле берется оригинал и перевод, в другом - исходный текст. При нахождении оригинала в исходном тексте оригинал заменяется на перевод.

то что вы описали - не задача, а придуманные вами костыли

Где вы увидели в моем решении костыли?

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

Если на один раз, то можно открыть в текстовом редакторе и заменить вручную.

На один раз я обычно скрипт не пишу.

Автоматизировать — например, так: http://stackoverflow.com/a/10467453/467290

Спасибо, посмотрим, что это даст.

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

Точек в шаблоне может и не быть. Шаблон может представлять собой как слово или фразу без точек, так и целое(ые) предложение(я) с точками.

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

Нет, не совсем правильно. По ссылке вышедаденой на stackoverflow - более правильное решение.

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

шаблон нужно сначала обработать, чтобы экранировать точки.

silwer@dalamar ~ $ a=$(echo 'т.к.' | sed 's/\./\\./g')
silwer@dalamar ~ $ echo $a
т\.к\.
silwer@dalamar ~ $ echo "т.к. что-то" | sed 's/'$a'/because/g'
because что-то
silw ★★★★★ ()
Ответ на: комментарий от schizoid
router@jb:~$ echo '12[35]45234т.к.$%^' | perl -e 'use utf8; if ( $ENV{"LANG"} =~ /UTF/i ) {  binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; }; while ($_=<>) { chomp; print "\Q$_\E\n";}'
12\[35\]45234т\.к\.\$\%\^
router@jb:~$

Заморачиваться с utf пришлось только из-за русских букв.

З.Ы. Как ты подсветку синтаксиса включил?

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

+1, пусть тс оторвется от этих ворот и присмотрится к другим.

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

Как ты подсветку синтаксиса включил?

[code=bash]
...
[/code]

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

шаблон нужно сначала обработать, чтобы экранировать точки.

Шаблон изменять нельзя, его используют и другие программы. А создать копию шаблона и менять - долго и костыльно.

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

grep -F

Grep-то в данном случае работает правильно, но sed - нет. Но мне нужна именно замена.

python/perl/ruby

Самосовершенствование, конечно, хорошо, но я не программист, и ради довольно-таки простых вещей python/perl/ruby учить не хочется.

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

хорошо, но я не программис

Тогда установи mysql - так был replace как бинарь.

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

Где вы увидели в моем решении костыли?

Перевод sed'ом это даже не костыли, а эпическая инвалидная коляска
Есть google translate в связке с консолью или консольная версия какого-нить stardict'а

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

Есть google translate в связке с консолью

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

консольная версия какого-нить stardict'а

У stardict'a свои словари. К тому же, вместо того, чтобы написать простое и легко расширяемое решение для себя, придется разбираться в чужом коде.

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

В одном файле берется оригинал и перевод, в другом - исходный текст. При нахождении оригинала в исходном тексте оригинал заменяется на перевод.

Если пар оригинал-перевод больше одной, то такое решение (много раз проходиться sed'ом по всему файлу) является неэффективным по времени. Следует использовать алгоритм Ахо-Корасик:

http://aho-corasick.narod.ru/

http://e-maxx.ru/algo/aho_corasick

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

perl, в отличие от sed, в виде
perl -p -i -e «s/$orig/$transl/g» «$tmpfile»
не жалуется на точки, зато не умеет обрабатывать выражения в виде «слово и/или слово, да еще при прогоне вместо „содержит кольцевой элемент“ я получил эпичное „содержиbecause�льцевой элемент“.

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

Почитаю на досуге, но мне хоть как-нибудь... :(

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

ну естественно, он же тебе не заэскейпил точки сам, а так и воспринимает их как спецсимвол в регулярном выражении.

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

Прошу прощения, было много вариантов, решил попробовать позже. Похоже, что работает :)

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

Вероятно, подойдет, но я использую текстовик с оригиналом/переводом и для других целей, например, чтобы создать словарь автозамены для OpenOffice.

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

зачем его менять для остальных программ? и с каких пор на шелле созлать еще одну переменную костыльно и долго?

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

зачем его менять для остальных программ?

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

и с каких пор на шелле созлать еще одну переменную костыльно и долго?

И что это такая за переменная?

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

Само по себе, переменную можно быстро создать. Я имел в виду, что затачивать исходный файл под sed долго и неправильно.

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

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

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