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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 154

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

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
      Шпаргалка по частым синтаксическим оборотам.

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

 

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tolyn77, все то же самое: УМВР, echo $BASH_VERSION, set -o xtrace.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:39 27-10-2015
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
зачем bash не уж то без него такую простую задачу не сделать?

Всего записей: 1505 | Зарегистр. 07-09-2004 | Отправлено: 08:32 28-10-2015
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ls -1 *.jpg | sed -e 's#^.\+_\([0-9]\{4\}\)-\([0-9]\+\)-\([0-9]\+\)_.*$#\1/\2/\3#' | xargs mkdir -p

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 08:37 28-10-2015
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
спсб
#ls -1 *.jpg
/sbin/ls: Слишком длинный список аргументов.

Всего записей: 1505 | Зарегистр. 07-09-2004 | Отправлено: 09:30 28-10-2015
ASE_DAG



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 09:43 28-10-2015
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, tolyn77
Тогда попробуйте:
ls | sed -n -r -e '/\.jpg/s#^.+_([0-9]{4})-([0-9]+)-([0-9]+)_.*$#mkdir -p \1/\2/\3; mv -t \1/\2/\3 \0#e'

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 09:59 28-10-2015
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
извините не углядел этой строки
Alex_Piggy
спсб
 
я сделал так
ls | grep jpg | sed 's/^name_\([0-9]*\)-\([0-9]*\)-\([0-9]*\)_\([0-9]*\)-\([0-9]*\)-\([0-9]*\)_\([0-9]*.jpg\)/mkdir -p "\/dir\/\1\/\2\/\3"; mv "name_\1-\2-\3_\4-\5-\6_\7" "\1\/\2\/\3"/' | $SHELL
работает как я и хотел

Всего записей: 1505 | Зарегистр. 07-09-2004 | Отправлено: 15:36 28-10-2015 | Исправлено: tolyn77, 17:00 28-10-2015
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как можно удалить содержимое конкретных тегов в xml-файле? Нужен скрипт для автоматизации, но с sed или awk никогда не имел дела и вообще плохо понимаю разницу между ними и когда что удобнее использовать.

Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 14:41 07-12-2015
mithridat1



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
Попробуйте через xmlstarlet
http://xmlstar.sourceforge.net/doc/UG/ch04s03.html

----------
Если ты не понимаешь, что я говорю, и сомневаешься, верно ли все это, обрати внимание по крайней мере на то, не сомневаешься ли ты в самом этом сомнении своем (Августин Блаженный)

Всего записей: 5025 | Зарегистр. 05-01-2006 | Отправлено: 15:06 07-12-2015
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mithridat1
Это для Slax, хотя размер с зависимостями скромный, хотелось бы обойтись имеющимися везде средствами. По идее достаточно простенького выражения <name>(.*?)</name>, но с grep/sed/awk дел не имел и мне всегда понятнее не абстрактные примеры, а решение конкретной нужной задачи.
Нужно удалить содержимое тегов, оставив <tag></tag>, разве XMLStarlet оставляет пустые?

Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 23:11 07-12-2015
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off> Нужно удалить содержимое тегов, оставив <tag></tag>, разве XMLStarlet оставляет пустые?
 
Странный вопрос. Пустая запись — абсолютно корректная запись. Как прикажете. blah-blah/tag/node().
 
>  По идее достаточно простенького выражения <name>(.*?)</name>
 
Это не простенькое регулярное выражение, а перловское. Насколько я знаю, ни одна реализация Седа или АВКа не умеет в перловские регулярные выражения.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:21 07-12-2015 | Исправлено: ASE_DAG, 23:39 07-12-2015
Skif_off

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

Цитата:
Странный вопрос. Пустая запись — абсолютно корректная запись.

Ничего странного, мне на нравиться, что в случае blah-blah/tag останется пустая строка, чисто эстетически не по душе. Спасибо, node() проглядел, вроде то, что хотел

Код:
xml ed -P -d "/blah-blah/tag/node()" d.xml > d.xml.tmp

Надо подумать: это Slax и XMLStarlet - +395 кб с зависимостями, но задача одна и мелкая, хотелось бы обойтись минимумом.
В общем, решения с sed/awk не нашёл, пробовал и убирать переносы для удобства. Но в Slax есть ещё неизвестный мне Perl

Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 02:03 08-12-2015 | Исправлено: Skif_off, 02:03 08-12-2015
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off>> Странный вопрос. Пустая запись — абсолютно корректная запись.
> Ничего странного
 
Странен вопрос «что делает xmlstarlet». Он делает то, что вы прикажете. :-)
 
> мне не нравится, что в случае blah-blah/tag останется пустая строка, чисто эстетически не по душе
 
Это значит, что у вас искомый узел, включая открывающий и закрывающий тэги, находится строго на одной строке? Почему тогда не удалять строку? Это, разумеется, отвратительное решение, но если вы хотите обойтись построчным фильтром типа Грепа / Седа / АВКа, то это вообще самое простое, что можно сделать:
 
$ grep -v '<tag>.*</tag>'
$ sed '/<tag>.*<\/tag>/d'
$ awk '! /<tag>.*<\/tag>/'


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:25 08-12-2015 | Исправлено: ASE_DAG, 03:26 08-12-2015
Skif_off

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

Цитата:
Он делает то, что вы прикажете.  

Как и многие другие утилиты, осталось понять, что и как приказать

Цитата:
Это значит, что у вас искомый узел, включая открывающий и закрывающий тэги, находится строго на одной строке?

Нет, в этом и проблема. И ещё: тег встречается в файле в нескольких местах, без жадности, наверное, захватит лишнего. В общем XMLStarlet, похоже, самое то.
 
P.S. И с Perl поторопился, успел даже написать рабочий скрипт, вот только оказалось, что Slax из коробки Perl не имеет...

Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 03:37 08-12-2015
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Skif_off А если так?
Цитата:
sed 's/<tag>[^<]*<\/tag>/<tag><\/tag>/g'
но сработает, если внутри этого тэга нет других, вложенных

Всего записей: 12816 | Зарегистр. 11-03-2002 | Отправлено: 04:49 08-12-2015
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
Спасибо, но вложенные есть.

Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 09:07 08-12-2015
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Skif_off
Ну в общем и целом можно в несколько этапов сэмулировать нежадность в SED.
 
1) если есть какой-то символ, который точно нигде в файле не встречается (скажем #):
Цитата:
sed 's/<\/tag>/#/g;s/<tag>[^#]*#/<tag><\/tag>/g'

2) если такого символа нет (более общий случай):
Цитата:
sed 's/#/<numbersign>/g;s/<\/tag>/#/g;s/<tag>[^#]*#/<tag><\/tag>/g;s/<numbersign>/#/g'
, где <numbersign> - точно нигде не встречается в файле

Всего записей: 12816 | Зарегистр. 11-03-2002 | Отправлено: 09:48 08-12-2015
Skif_off

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

Код:
<tag>[^#]*#

ничего не захватывает, похоже, дело в переносе строк: если их убрать и пустить <tag>.*</tag> в одну строку, то срабатывает.
 
Однако, всё равно спасибо, покопался, вот так вроде получается:

Код:
cat file.xml | tr -t '\r' '\t' | tr -t '\n' '\t' | sed -r 's/<\/tag>/#/g;s/<tag>[^#]*#/<tag\/>/g' | tr -t '\t' '\n' > file.xml

Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 12:11 08-12-2015
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Skif_off
1) небезопасно, если вдруг в файле уже будут табы;
2) менять \r и \n можно в одной команде tr
Цитата:
tr \r\n [\t*]
3) в конце табы меняются на \n: в т.ч. и те, которые были \r

Всего записей: 12816 | Зарегистр. 11-03-2002 | Отправлено: 12:34 08-12-2015
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
1) Вероятность исчезающе мала, поэтому решил, что так проще. Была ещё мысль использовать вертикальную табуляцию.
2) Не получалось, уже не помню, как пробовал (ещё вчера), сегодня по памяти.  
3) Замена \r на всякий случай, вероятность крайне низкая, свернул
Пока остановился на таком варианте:

Код:
cat d.xml | tr '[\r\n]' '[\t*]' | sed -r 's/<\/tag>/#/g;s/<tag>[^#]*#/<tag\/>/g' | tr -s '\t' '\n' > d.xml.tmp


Всего записей: 6598 | Зарегистр. 28-01-2008 | Отправлено: 13:43 08-12-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 154

Компьютерный форум 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