mCut.sh 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/bash
  2. E='echo -e'; # -e включить поддержку вывода Escape последовательностей
  3. e='echo -en'; # -n не выводить перевод строки
  4. p='+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+'
  5. trap "R;exit" 2 #
  6. ESC=$( $e "\e")
  7. TPUT(){ $e "\e[${1};${2}H" ;}
  8. CLEAR(){ $e "\ec";}
  9. # 25 возможно это
  10. CIVIS(){ $e "\e[?25l";}
  11. # это цвет текста списка перед курсором при значении 0 в переменной UNMARK(){ $e "\e[0m";}
  12. MARK(){ $e "\e[1;94m";}
  13. # 0 это цвет списка
  14. UNMARK(){ $e "\e[0m";}
  15. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Эти строки задают цвет фона ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  16. R(){ CLEAR ;stty sane;CLEAR;}; # в этом варианте фон прозрачный
  17. # R(){ CLEAR ;stty sane;$e "\ec\e[37;44m\e[J";}; # в этом варианте закрашивается весь фон терминала
  18. # R(){ CLEAR ;stty sane;$e "\ec\e[0;45m\e[";}; # в этом варианте закрашивается только фон меню
  19. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  20. HEAD(){ for (( a=2; a<=33; a++ ))
  21. do
  22. TPUT $a 1
  23. $E "\e[94m\xE2\x94\x82 \xE2\x94\x82\e[0m";
  24. done
  25. TPUT 2 4
  26. $E "\033[1;35m*** Cut ***\033[0m";
  27. TPUT 3 4
  28. $E "\033[90mудалить разделы из каждой строки файлов\033[0m";
  29. TPUT 4 1
  30. $E "\033[34m+----------------------------------------------------------------------------------------+\033[0m";
  31. TPUT 11 3
  32. $E "Опции \033[34mOption\033[0m";
  33. TPUT 23 3
  34. $E "\033[90mИспользуйте один и только один из -b, -c или -f.\033[0m";
  35. TPUT 24 3
  36. $E "\033[90mКаждый СПИСОК состоит из одного или нескольких диапазонов, разделенных запятыми.\033[0m";
  37. TPUT 25 3
  38. $E "\033[90mВыбранный ввод записывается в том же порядке что он читается и пишется ровно один раз.\033[0m";
  39. TPUT 26 3
  40. $E "\033[90mКаждый диапазон является одним из:\033[0m";
  41. TPUT 32 3
  42. $E "\033[90mUp \xE2\x86\x91 \xE2\x86\x93 Down Select Enter\033[0m";
  43. FOOT(){ MARK;TPUT 34 1
  44. $E "$p";UNMARK;}
  45. MARK;TPUT 1 1
  46. $E "$p" ;UNMARK;}
  47. i=0; CLEAR; CIVIS;NULL=/dev/null
  48. # это управляет кнопками ввер/хвниз
  49. i=0; CLEAR; CIVIS;NULL=/dev/null
  50. #
  51. ARROW(){ IFS= read -s -n1 key 2>/dev/null >&2
  52. if [[ $key = $ESC ]];then
  53. read -s -n1 key 2>/dev/null >&2;
  54. if [[ $key = \[ ]]; then
  55. read -s -n1 key 2>/dev/null >&2;
  56. if [[ $key = A ]]; then echo up;fi
  57. if [[ $key = B ]];then echo dn;fi
  58. fi
  59. fi
  60. if [[ "$key" == "$($e \\x0A)" ]];then echo enter;fi;}
  61. M0(){ TPUT 5 3; $e "Kраткий обзор \e[32mSynopsis \e[0m";}
  62. M1(){ TPUT 6 3; $e "Описание \e[32mDescription \e[0m";}
  63. M2(){ TPUT 7 3; $e "Авторы \e[32mAuthors \e[0m";}
  64. M3(){ TPUT 8 3; $e "Сообщение об ошибках \e[32mReporting Bugs \e[0m";}
  65. M4(){ TPUT 9 3; $e "Авторские права \e[32mCopyright \e[0m";}
  66. M5(){ TPUT 10 3; $e "Смотрите также \e[32mSee Also \e[0m";}
  67. #
  68. M6(){ TPUT 12 3; $e "Выберите только эти байты \e[32m-b --bytes=LIST \e[0m";}
  69. M7(){ TPUT 13 3; $e "Вырезать подстроку из строки определённой длины \e[32m-c --characters=LIST \e[0m";}
  70. M8(){ TPUT 14 3; $e "Укажите разделитель, который вместо разделителя \e[32m-d --delimiter=DELIM \e[0m";}
  71. M9(){ TPUT 15 3; $e "Выберите только эти поля \e[32m-f --fields=LIST \e[0m";}
  72. M10(){ TPUT 16 3; $e "Игнорируется \e[32m-n \e[0m";}
  73. M11(){ TPUT 17 3; $e "Дополнить набор выбранных байтов, символов или полей \e[32m --complement \e[0m";}
  74. M12(){ TPUT 18 3; $e "Не печатать строки, не содержащие разделителей \e[32m-s --only-delimited \e[0m";}
  75. M13(){ TPUT 19 3; $e "Используйте STRING в качестве выходного разделителя \e[32m --output-delimiter=STRING \e[0m";}
  76. M14(){ TPUT 20 3; $e "Разделитель строк NUL, а не новая строка \e[32m-z --zero-terminated \e[0m";}
  77. M15(){ TPUT 21 3; $e "Показать эту справку и выйти \e[32m --help \e[0m";}
  78. M16(){ TPUT 22 3; $e "Вывести информацию о версии и выйти \e[32m --version \e[0m";}
  79. #
  80. M17(){ TPUT 27 3; $e "N-й байт, символ или поле, считая от 1 \e[32mN \e[0m";}
  81. M18(){ TPUT 28 3; $e "От N-го байта, символа или поля до конца строки \e[32mN- \e[0m";}
  82. M19(){ TPUT 29 3; $e "От N-го до M-го (включительно) байта, символа или поля \e[32mN-M \e[0m";}
  83. M20(){ TPUT 30 3; $e "От 1-го до M-го (включительно) байта, символа или поля \e[32m-M \e[0m";}
  84. M21(){ TPUT 31 3; $e "\e[32mGrannik Git \e[0m";}
  85. #
  86. M22(){ TPUT 33 3; $e "Выход \e[32mExit \e[0m";}
  87. LM=22
  88. MENU(){ for each in $(seq 0 $LM);do M${each};done;}
  89. POS(){ if [[ $cur == up ]];then ((i--));fi
  90. if [[ $cur == dn ]];then ((i++));fi
  91. if [[ $i -lt 0 ]];then i=$LM;fi
  92. if [[ $i -gt $LM ]];then i=0;fi;}
  93. REFRESH(){ after=$((i+1)); before=$((i-1))
  94. if [[ $before -lt 0 ]];then before=$LM;fi
  95. if [[ $after -gt $LM ]];then after=0;fi
  96. if [[ $j -lt $i ]];then UNMARK;M$before;else UNMARK;M$after;fi
  97. if [[ $after -eq 0 ]] || [ $before -eq $LM ];then
  98. UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;}
  99. INIT(){ R;HEAD;FOOT;MENU;}
  100. SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;}
  101. ES(){ MARK;$e " ENTER = main menu ";$b;read;INIT;};INIT
  102. while [[ "$O" != " " ]]; do case $i in
  103. 0) S=M0 ;SC;if [[ $cur == enter ]];then R;echo " cut OPTION... [FILE]...";ES;fi;;
  104. 1) S=M1 ;SC;if [[ $cur == enter ]];then R;echo " Вывести выбранные части строк из каждого ФАЙЛА в стандартный вывод. Если ФАЙЛ отсутствует или если ФАЙЛ равен -, читать стандартный ввод.
  105. Обязательные аргументы для длинных опций обязательны и для коротких опций.";ES;fi;;
  106. 2) S=M2 ;SC;if [[ $cur == enter ]];then R;echo " Написано Дэвидом М. Игнатом, Дэвидом Маккензи и Джимом Мейерингом.";ES;fi;;
  107. 3) S=M3 ;SC;if [[ $cur == enter ]];then R;echo " Онлайн-справка GNU coreutils: https://www.gnu.org/software/coreutils/
  108. Сообщайте обо всех ошибках перевода по адресу: https://translationproject.org/team/";ES;fi;;
  109. 4) S=M4 ;SC;if [[ $cur == enter ]];then R;echo "
  110. Copyright © 2020 Free Software Foundation, Inc. Лицензия GPLv3+: GNU GPL версии 3 или выше: https://gnu.org/licenses/gpl.html
  111. Это бесплатное программное обеспечение: вы можете изменять и распространять его. НИКАКИХ ГАРАНТИЙ, насколько это разрешено законом.
  112. ";ES;fi;;
  113. 5) S=M5 ;SC;if [[ $cur == enter ]];then R;echo " Полная документация: https://www.gnu.org/software/coreutils/cut
  114. или доступно локально через: info (coreutils) cut invocation";ES;fi;;
  115. 6) S=M6 ;SC;if [[ $cur == enter ]];then R;echo -e "
  116. \e[32m echo \"abcdefghijklmnopqrstuvwxyz\" | cut -b 7\e[0m
  117. Если же необходимо вырезать несколько символов, их номера указывают через запятую:
  118. \e[32m echo \"abcdefghijklmnopqrstuvwxyz\" | cut -b 7,9,12\e[0m
  119. вырезать некоторый диапазон символов:
  120. \e[32m echo \"abcdefghijklmnopqrstuvwxyz\" | cut -b 7-12\e[0m
  121. вырезать символы из текста, который находится в файле:
  122. \e[32m cut -b 1,9 example.txt\e[0m
  123. вырезание символов в заданном диапазоне находится в файле:
  124. \e[32m cut -b 4-9 example.txt\e[0m
  125. чтобы команда вырезала все символы, начиная с пятого:
  126. \e[32m cut -b 5- example.txt\e[0m
  127. начиная с первого байта и заканчивая шестнадцатым:
  128. \e[32m cut -b -16 example.txt\e[0m
  129. будем использовать двоеточие в качестве разделителя:
  130. \e[32m cut -d: -f1 text.txt\e[0m
  131. ";ES;fi;;
  132. 7) S=M7 ;SC;if [[ $cur == enter ]];then R;echo -e "
  133. \e[32m echo \"abcdefg\" | cut -c3-5\e[0m
  134. вырезать первый символ можно так:
  135. \e[32m echo \"abcdefg\" | cut -c 1\e[0m
  136. вырезать часть текста из готового документа:
  137. \e[32m echo \"abcdefg\" | cut -c 1\e[0m
  138. ";ES;fi;;
  139. 8) S=M8;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  140. 9) S=M9;SC;if [[ $cur == enter ]];then R;echo -e "
  141. Выберите только эти поля; также вывести любую строку, не содержащую символ-разделитель, если не указана опция -s
  142. Чтобы вырезать слово из первого столбца, воспользуемся командой
  143. \e[32m echo \"Cognosce te ipsum\" | cut -d ' ' -f 1\e[0m
  144. В случае с текстовым файлом результат такой же — первое слово каждого столбца напечатано в терминале:
  145. \e[32m cut -d ':' -f 1 example.txt\e[0m
  146. Чтобы вырезать несколько столбцов, нужно указать их номера:
  147. \e[32m echo \"Cognosce te ipsum\" | cut -d ' ' -f 2,3\e[0m
  148. При использовании текстового файла аналогичная команда выглядит так:
  149. \e[32m cut -d ':' -f 1,2,3 example.txt\e[0m
  150. виде диапазона чисел:
  151. \e[32m cut -d ':' -f 1-3 example.txt\e[0m
  152. Обратите внимание на два апострофа, которые из раза в раз появляются в записи команды при работе с текстом из стандартного ввода.
  153. Эти знаки необходимы, если разделителем является символ пробела
  154. Вырезать содержимое, начиная с определенного столбца
  155. \e[32m echo \"Cognosce te ipsum\" | cut -d ' ' -f 2-\e[0m
  156. ";ES;fi;;
  157. 10) S=M10;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  158. 11) S=M11;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  159. 12) S=M12;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  160. 13) S=M13;SC;if [[ $cur == enter ]];then R;echo " Используйте STRING в качестве выходного разделителя, по умолчанию используется входной разделитель.";ES;fi;;
  161. 14) S=M14;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  162. 15) S=M15;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  163. 16) S=M16;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  164. 17) S=M17;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  165. 18) S=M18;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  166. 19) S=M19;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  167. 20) S=M20;SC;if [[ $cur == enter ]];then R;echo " ";ES;fi;;
  168. 21) S=M21;SC;if [[ $cur == enter ]];then R;cat README.md;ES;fi;;
  169. #
  170. 22) S=M22;SC;if [[ $cur == enter ]];then R;ls -l;exit 0;fi;;
  171. esac;POS;done