hunzip
инструмент распаковки. Для сжатия Вы хотите посмотреть на hzip
. Оба будут воздействовать на текстовые файлы, но они оптимизированы для работы с отсортированными словарями и списками слов.
По умолчанию sed
механизм regex является жадным. Это означает, что шаблон всегда соответствует самому долгому соответствию. Необходимо сделать нежадный поиск, но я думаю, что sed не поддерживает нежадные поиски. Поэтому необходимо добавить точку (точки) опоры к шаблону поиска так, чтобы sed
находит самое короткое соответствие.
Следующая строка пытается эмулировать нежадное соответствие для Вашего особого случая, и это не требует универсальность, начиная с сингла w
между update
и первое where
делает шаблон недопустимым:
sed -e 's/^Update[^w]*where//ig'\
-e "s/^/insert into mytemp select * from mytable where /g" n.txt
Другие regex-механизмы поддерживают эту функцию, как, например, та perl
и awk
.
Но в Вашем случае я думаю выражение как это
sed -e 's/^Update.\+where\(.\+where.*\)$/\
insert into mytemp select * from mytable where \1/ig' n.txt
был бы более удобен связанный с Вашей определенной проблемой.
(запаздывание \
в строках выше только добавляются для создания строк более четкими.)
Регулярное выражение, соответствующее, выполняется слева направо, и с самым долгим соответствием, взятым в предпочтении. Следовательно ^Update.*where
соответствует последнему вхождению where
на строке.
Один способ сделать это соответствие состоял бы в том, чтобы использовать нежадный квантор для *
. Sed не поддерживает нежадные кванторы, но жемчуг делает.
perl -pe 's/^update.*?where//i; s/^/insert into mytemp select .*? from mytable where /'
Иначе то, которое может или не может соответствовать Вашим данным, должно было бы отклонить круглые скобки в имени таблицы и colum настройках.
sed -e 's/^update[^()]*where//i' -e 's/^/insert into mytemp select [^()]* from mytable where /'
Более тщательно продуманный метод должен был бы сначала заменить первое where
уникальным маркером затем сделайте свою замену и наконец возвратите маркер в where
. Так как sed работает линию за линией, строка, как гарантируют, не будет содержать символ новой строки, представленный \n
в sed.
sed -e 's/ where /\n/' \
-e 's/^update.*$//i' -e 's/^/insert into mytemp select .* from mytable where /' \
-e 's/\n/ where/'