Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как-то долго разбирать залежи старых файлов руками, надо применить автоматизацию:
find $PATH_BASE -mtime 3650 -exec cp -pv {} $OUT \;
и вот тут снова проблема. База содержит папки с файлами, а скрипт копирует все в одну. Как сделать чтобы файл копировался с его верхней папкой (cp -R начинает копировать от корня-не подходит) ?

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 21:52 08-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
можно извратится и заняться парсингом - что я очень люблю)))
можно проще -
Код:
tar -cf - `find $PATH_BASE -type f -mtime -3650` > /tmp/arch.tar && tar -C $OUT -xf /tmp/arch.tar && rm -f /tmp/arch.tar

Скажите а откуда такое число - 3650? Это 152,08(3)дня...
 
Можно еще чисто tar'ом обойтись...
Код:
tar -cN 2011-08-30 -C $PATH_BASE ./ > /tmp/arch.tar && tar -C $OUT -xf /tmp/arch.tar && rm -f /tmp/arch.tar
тут один косяк есть в том, что пустые каталоги накопирует... Ну и дата указывается в виде прямой даты, а не прошедшем с того момента времени, что не всегда удобно, но как вариант более чем сойдет. Зато без использования find обошлось...

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 22:25 08-09-2011 | Исправлено: Alukardd, 10:31 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> <\?.*?\?> написать так: <\?[^>]*\?>
> Оба варианта будут делать одно и тоже.
Ну, далеко не одно и то же. И если речь о PHP-коде, то <\?[^>]*\?> вам никак не подходит, здесь нужна именно нежадная квантификация (ну или отрицание строки), ни то, ни другое egrep не умеет.
 
> к сожалнию в FreeBSD ключ -P не поддерживается
Да, увы. Я, между прочим, не случайно повесил в шапку объявление с просьбой указывать тот факт, что вы желаете обойтись дефолтным функционалом вашей системы, если она — не ГНУ. ;-)
 
Так что, будем использовать Перл.
 
Я, ко всему прочему, не вполне уловил, зачем вам выводить найденные последовательности. Вам же их, судя по описанной задаче, вырезать надо. Это и сделаем. В том, что вы попытались исполнить (perl -pe "m|<\?.*?\?>|gis", а зачем, кстати, игнорировать регистр?), вообще не хватает ключа -n, поэтому он вообще и читать ничего не будет. Однако и корректный (по идее) вариант:
$ perl -npe 's/<\?.*?\?>//gs' file
здесь не сработает (а ХЗ почему, была там какая-то багофича, погуглите, если интересно), поэтому распишем содержание ключей -n и -p:
$ perl -e 'undef $/; $_=<>; s/<\?.*?\?>//gs; print;' file
вот это, как ни парадоксально, работает.
 
Вот так. Для начала можете использовать это и в связке с файндом, но потом лучше отказаться от шелла и переложить рекурсивный обход каталогов тоже на Перл — будет быстрее (возможно даже весьма быстрее). ;-)

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:21 09-09-2011 | Исправлено: ASE_DAG, 15:09 10-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
perl -e 'undef $/; $_=<>; s/<\?.*\?>//gs; print;' file
выглядит покрасивше чем мой костыль))), правда обход вы пока не добавили.
А что дает $_=<> ??? Если я правильно толкую, то $_ и так содержит текущую строку... А <> вроде тоже?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 19:07 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> А что дает $_=<>?
То же, что ключ -n, который в данном случае по неизвестной мне причине не катит.
 
> выглядит покрасивше
Дело не в «красивше», а в:
а) нежадных операторах, которые здесь нужны, ибо <\?[^>]*\?> здесь не подходит;
б) том, что ваше tr -d '\r\n' потенциально портит бинарный файл, можно только найти завирусованные бинарники, но не обрабатывать их.
 
digital422
> $ find $PATH_BASE -mtime 3650 -exec cp -pv {} $OUT \;
> База содержит папки с файлами, а скрипт копирует все в одну. Как сделать чтобы файл копировался с его верхней папкой
У cp есть ключ --parents. You've RTFM, haven't?
А вообще, подход к задаче Таром, что предложил т. Алукард, хорош, используйте его.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:39 09-09-2011 | Исправлено: ASE_DAG, 19:40 09-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
ваше tr -d '\r\n' потенциально портит бинарный файл
ну не мой, а gnu coreutiles, к тому же он работает не с файлом. а со входным потоком данных и испортить ни чего не могёт.
Цитата:
У cp есть ключ --parents. You've RTFM, haven't?
жесть) я его вчера 2 раза прочел Но каждый раз когда читал "use full source file name under DIRECTORY" не расценивал это как то, что требуется в задаче...
 
Добавлено:

Цитата:
То же, что ключ -n
ну я просто не совсем понял что и он делает))) Заставляет тело программы бесконечно крутится? Т.е. организует построчное чтение? Так строки вроде только что убрали... Или только сказали не считать его за разделитель, но читать все равно будет построчно?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 20:15 09-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
tar -cf - `find $PATH_BASE -type f -mtime -3650` > /tmp/arch.tar && tar -C $OUT -xf /tmp/arch.tar && rm -f /tmp/arch.tar

делает аналогично моему скрипту, копирует (в конечном итоге будет перемещать) файлы со всеми верхними папками от корня, а надо чтобы была только первая папка, в которой лежит файл.
-mtime 3650 - это не 10 лет?
 
Вот так создается структура папок, как во входящей папке:

Код:
 
cd "$PATH_IN"
find ./ -type d | awk '{system ("mkdir -p \"/tmp/test-out/"$0"\"")}'
 

осталось найти файлы из этих папок и скопировать их в /tmp/test-out/"$0"

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 21:29 09-09-2011 | Исправлено: digital422, 22:20 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> он работает не с файлом а со входным потоком данных и испортить ни чего не могёт
Он могет испортить поток данных. ;-) Если вырезать эту бяку задачи стоять не будет, то можно его и покорежить.
То, что я привел, кстати, тоже не с файлом работает (ключа -i там нет).
 
> организует построчное чтение?  
Совершенно верно.  
 
> Или только сказали не считать его за разделитель
Сказали (флагом s) включать \n в . (точку — множество любых символов).
 
Добавлено:
digital422
> -mtime 3650 - это не 10 лет?
Да, примерно (не забываем про високосные года) десять.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:59 09-09-2011 | Исправлено: ASE_DAG, 01:56 10-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
все верно - у меня уже тупняк - я еще раз на 24часа разделил)))
Цитата:
надо чтобы была только первая папка, в которой лежит файл
так первая или в которой непосредственно лежит?
 
Короче, порыл там сям - ни чего путного не нашёл. Либо писать полноценный скрипт либо довольствоваться тем, что есть. Можете еще поизощьраться с опцией tar'а --strip-components, ей можно передать число, например 2, и тогда первая 2 уровня каталогов отстегнуться и не будут создаваться в конечной директории, но как варьировать это число в зависимости от глубины я хз.
 
А зачем вам полная структура? Сами же от неё отказались... Или я последнюю мысль не уловил.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 23:08 09-09-2011 | Исправлено: Alukardd, 23:08 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> со всеми верхними папками от корня
Ну значит у вас $PATH_BASE задан от корня. А файнд в каком виде путь получил, в таком и выдает. Вы, я смотрю, пошли по правильному пути — сменили текущую директорию, а вот дальше (извините) какая-то ерунда.
 
> а надо чтобы была только первая папка, в которой лежит файл
Более чем странный подход. Может быть, все-таки вам нужно все дерево вниз, начиная с какой-либо директории, а?
Делаете в нее cd, а затем $ find -type f -mtime 3650 cp -pv --parents {} $DEST \; (это если хотите файндом и копи).

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:10 09-09-2011 | Исправлено: ASE_DAG, 23:11 09-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG - то, что надо было !!!
cd "$PATH_IN"
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \;
find -type f -mtime 3650 -exec rm -v -r {} \;
 

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 08:37 10-09-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
ASE_DAG, Ну, далеко не одно и то же. И если речь о PHP-коде, то <\?[^>]*\?> вам никак не подходит, здесь нужна именно нежадная квантификация

Совершенно одно и тоже
<\?.*?\?>
и
<\?[^>]*\?>
 
 

Цитата:
ASE_DAG, Я, между прочим, не случайно повесил в шапку объявление с просьбой указывать тот факт, что вы желаете обойтись дефолтным функционалом вашей системы, если она — не ГНУ.

Меня не интересует только дефолтный функционал. Для этих целей на машине с FreeBSD был установлен Perl, php и Midnight Commander, на машине с Windows установлены notepad++ и FAR (фаром пользуюсь уже очень давно)
 

Цитата:
ASE_DAG, Я, ко всему прочему, не вполне уловил, зачем вам выводить найденные последовательности. Вам же их, судя по описанной задаче, вырезать надо. Это и сделаем.

Для начала надо найти, а удалить или заменить можно всегда. Если сразу заменять не видя, что именно я заменяю, то можно поудалять очень важные данные.
 
 
Поиск и замену я всегда производил так:
1. perl -pe "s|\s*<script.*?>.*?</script>\s*||gi" old.sql > new.sql
2. perl -pe "s|\s*<script[^>]*>.*?</script>\s*||gi" old.sql > new.sql
оба способа 100% одинаковые.
 
 
 
 
 

Цитата:
ASE_DAG, В том, что вы попытались исполнить (perl -pe "m|<\?.*?\?>|gis", а зачем, кстати, игнорировать регистр?)

Игнорировать регистр надо, например, для того, чтобы найти <script что-то> и <sСrIpT что-то> или <?PHP что-то ?> и <?php что-то ?>
 
 
 
 

Цитата:
ASE_DAG, $ perl -e 'undef $/; $_=<>; s/<\?.*\?>//gs; print;' file  вот это, как ни парадоксально, работает.

Выводит 1 в 1 тоже, что и мой пример с ключём -p
Выводит не найденное, а все строки, в которых производился поиск. В Вашем примере не отменена жадность.
 
 
 
 
 
Пока ни один способ не работает! Мне нужное решение, как вот тут: http://regexr.com?2ule3
Если Вы зайдете по ссылке, то увидите пример файла и как я в нём нашел нужные мне вещи.

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 09:07 10-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \;
find -type f -mtime 3650 -exec rm -v -r {} \;  
честно, вы очень странно объясняете... СПРАВКА: команде find можно передать несколько ключей -exec
Код:
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \; -exec rm -v -r {} \;


----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 13:27 10-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422

Цитата:
cd "$PATH_IN"
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \;
find -type f -mtime 3650 -exec rm -v -r {} \;

Зачем вы два раза ищете одно и то же? О_о Файнду можно указывать несколько ключей -exec. А, что, кстати, если копирование завершилось неудачно, о таком варианте не думали? И зачем удалять один файл рекурсивно?
 
$ find -type f -mtime 3650 -exec sh -c 'cp -pv --parents {} $PATH_OUT/ && rm -v {}' \;
 
Да и вообще, даже если сейчас вы перемещаете файл между файловыми системами, все-равно расписывать перемещение как копирование+удаление не стоило.


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:39 10-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
все-равно расписывать перемещение как копирование+удаление не стоило.  
это кстати да... всегда есть mv.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 14:51 10-09-2011 | Исправлено: Alukardd, 14:52 10-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В mv нет parents, из-за которого я долго не мог решить как же решить данную задачу по переносу файла со своей папкой или папку со своим файлом (кому как нравится).
 
Alukardd

Цитата:
честно, вы очень странно объясняете...  

Человек индивидуален, у каждого есть недостатки и особенности изложения задач.

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 15:04 10-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> Совершенно одно и тоже :smoke:
> <\?.*?\?> и <\?[^>]*\?>
Ошибаетесь.
 

Код:
<!DOCTYPE html>
<html>
  <head>
   <meta charset="utf-8" />
   <title>Greedy regex vs lazy regex</title>
 </head>
  <body>
  <?php
  echo '<p>Hello World!</p>';
  ?>
  </body>
</html>

 
 
> не интересует только дефолтный функционал
Ну и что тогда ссылаетесь на отсутствие ГНУ Грепа, поставили бы. Но сейчас-то это уже не нужно.
 
> Для начала надо найти
> можно поудалять очень важные данные
Резервное копирование никто не отменял. Но, да это ваше дело.
 
> $ perl -e 'undef $/; $_=<>; s/<\?.*?\?>//gs; print;' file
> Выводит не найденное, а все строки, в которых производился поиск.
А с какого перепуга он будет выводить php-вставки, если его задача — их вырезать. Он их успешно вырезает. Знак вопроса, указывающий на нежадность, конечно, был просто пропущен, исправил. ;-)

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:08 10-09-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
ASE_DAG, Ошибаетесь.
Огромное спасибо за этот пример! Я действительно был неправ и всегда не понимал почему оба способа делают одно и тоже. Но теперь понял! Спасибо!!! :beer:
 

Цитата:
ASE_DAG, Резервное копирование никто не отменял. Но, да это ваше дело.

Но я ведь не буду делать поиск и замену по 200 000 файлов и потом искать в каких произошла замена.
Мне лучше найти и вручную удалить. Из этих 200 000 файлов вхождения могут быть найдены, например, в 10-и файлах.
 
 
 

Цитата:
А с какого перепуга он будет выводить php-вставки, если его задача — их вырезать.

Я делал не s///, а m// :shuffle: мне нужно найти, а не заменить.
Попробовал Ваш способ с заменой и у меня на экран вывелось из файла всё, кроме найденных вхождений, причём файл не был изменён. Но мне надо не показывать всё кроме вхождений, а наоборот показывать только найденное и отображать путь к файлу, так как в папке, где я буду производить поиск огромное количество папок и подпапок.
 
А поиск и замену я всегда делал так и отлично работало:
perl -pe "s|<\?.*?\?>||gis" old.sql > new.sql
 
 
Пока же я не знаю, как решить мою проблему! Но за Ваш пример еще раз огромное спасибо!
 
Добавлено:
ASE_DAG, http://regexr.com?2ulfa и http://regexr.com?2ulfd
Если бы Вы мне не показали этот пример, то вот такой кусок кода <?php echo "<p>ст текст текст</p>" ?> всегда оставался бы незамеченным. :jump:

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 16:39 10-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> причём файл не был изменён
Если хотите, чтобы изменялся оригинальный файл, укажите perl'у ключ -i.
 
$ perl -i~ -e 'undef $/; $_=<>; s/<\?.*?\?>//gs; print;' file
— файл file будет перезаписан, а резервная копия сохранена в файле file~.
 
> Огромное спасибо за этот пример!
Всегда пожалуйста. :-)
 
> мне нужно найти, а не заменить
 Да пожалуйста, держите. Ну хоть имя файла еще что-ли выведите, а то что вы потом с этими кусками злокода делать-то станете. ;-)
$ perl -e 'undef $/; $_=<>; @M = m/<\?.*?\?>/gs; $,="\n"; print ($ARGV, @M, "") if @M;' file
 
> http://regexr.com
Надо этот ресурс в шапку что-ли добавить...
 
Добавлено:
> А поиск и замену я всегда делал так и отлично работало:
> perl -pe "s|<\?.*?\?>||gis" old.sql > new.sql
Ну либо у нас разный Перл, либо в SQL-дампах нет перевода строк внутри <? ?>.
 
Да, конструкцию undef $/; $_=<>; (т.е. загрузку всего файла в память), если Перл будет таки вызываться из шелла, вполне можно заменить ключами -0n.
$ perl -0ne '@M = m/<\?.*?\?>/gs; $,="\n"; print ($ARGV, @M, "") if @M;' file
 
В вашем случае, это, кстати, не тождественная замена. -0 — это не undef $/, а $/="\0", а оный нулевой байт в бинарных файлах-то есть и много его есть, лучше undef.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:51 10-09-2011 | Исправлено: ASE_DAG, 18:37 10-09-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
ASE_DAG, Ну либо у нас разный Перл, либо в SQL-дампах нет перевода строк внутри <? ?>.
Вы меня убили
Оказывается мой пример не удаляет, если есть перевод строк. Вы правы в MySQL-дампе нет перевода строк внутри <? ?> и по этому я всегда думал, что это работает.
 
 
 
 
Но почему же оно не работает, ведь ключ s описан в документации perl. Вот, например, http://www.opennet.ru/base/dev/pcre_perl_intro.txt.html

Цитата:
 
   Как правило все эти операторы имеют схожие опции такие как:
 
     * i - не различать строчные и заглавные буквы;
     * m - считать строку многострочной;
     * s - однострочная строка;
     * x   -   расширенный   синтаксис   (   использование   пробелов   и
       комментариев).
 

 
 
Если честно, то мне не понятен код, который Вы пишите. С perl ничего общего не имел, кроме регулярок.
Может можно написать код проще и понятнее, если не использовать командную строку, а написать скрипт в файле и запускать уже готовый файл?
 
 
ASE_DAG, Ваш пример работает отлично
Но когда я пишу такой код на php, то понимаю его, а тут не совсем

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 20:07 10-09-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru