facebook LinkedIn
Google Book Search
Прегледи

Текстови редактори и обработка на текст. Упражнения

от Курс за ССОК

Лекцията запознава читателя с различни текстови редактори като се съсредоточава върху конзолните такива и върху командите за обработка и работа с текст.

Съдържание

Какво е текстов файл и текстов редактор и защо ни е нужен?

Обикновен текстов файл (plain text) е файл, който съдържа букви, цифри, препинателни знаци и други знаци, които могат да бъдат въведени от клавиатурата и отпечатани на екрана/принтера. Текстовия файл несъдържа информация за шрифта, форматирането или големината на текста. В този контекст трябва да се прави разлика между текстов файл и файл, който съдържа само текст (пр. офис документ). Всеки файл, който не съдържа нищо друго освен текстова информация е текстов файл. Повече за текстовите файлове можете да намерите на http://en.wikipedia.org/wiki/Text_file

Текстов редактор е програма, която се използва за редактиране и създаване на текстови файлове. Повечето редактори са интерактивни, т.е. взаимодействат с потребителя, но има и такива, които работят в автоматичен режим (пр. sed). Интересна статия за текстовите редактори е налична на http://en.wikipedia.org/wiki/Text_editor, а таблици със сравнение на различни текстови редактори можете да видите на http://en.wikipedia.org/wiki/Comparison_of_text_editors.

Текстовите файлове са едни от най-многобройните файлове в Линукс и затова съществуват много редактори и допълнителни команди за работа с тях. В текстови файлове са записани конфигурациите на програмите, потребителски настройки, помощната документация, изходния код на програмите и някои данни (като речник например).

Текстовите редактори в Линукс

В съвременните графични среди за работа съществуват множество редкатори, някои от тях с определена цел (пр. работа с HTML файлове). Популярни графични редактори са Gedit, Kate, Nedit, Bluefish и други. Различават се по външния изглед и възможностите които предоставят (пр. оцветяване при писане на изходен код на даден програмен език).

В лекцията ще се съсредоточим върху редакторите работещи в текстов режим, тези които ще използваме в терминала. Като упражнение всеки студент може да изпробва и графичните редактори инсталирани на системата му.

vi

Vi е един от най-старите текстови редактори. В сравнение с други редактори той е по-сложен, но за успешното му ползване е необходимо да знаете само няколко операции. Ползата от научаването на тези основни операции е, че Vi е наличен на всяка Линукс и Юникс система. Това е редакторът, който се използва от много други програми и е наличен веднага след инсталация.

Vi работи различни режими като между тях се превключва чрез натискане на клавиш от клавиатурата. Връщане към началния режим се извършва с натискане на клавиш Esc.

Движение на курсора:

  • чрез използване на стрелките на клавиатурата или
  • h (ляво), j (надолу), k (нагоре), l (дясно)

Изход от редактора и запис:

  • <ESC>:q! - изход от редактора без запазване на промените (quit).
  • <ESC>:wq - изход от редактора със запазване на промените (write and quit).
  • <ESC>:w - запазва промените без да затваря редактора (write).

Редакция на текст:

  • x - изтрива символа под курсора
  • i - стартира режим на вмъкване (insert) на текст под курсора. Въведете текста и натиснете Esc, за да се върнете в началния режим.
  • a - стартира режим на добавяне (append) на текст след курсора. Въведете текста и натиснете Esc, за да се върнете в началния режим.
  • dd - изтрива целия ред

Търсене на текст:

  • Както при less. Напишете /текст и натиснете Enter.

Vi има още много различни команди, чрез които можете да копирате текст (дума, ред, блок и т.н.), да изтривате или местите (дума, ред, блок) и др. Повече информация за този текстов редактор можете да намерите с man vi.

Задача: Стартирайте интерактивния учител на vi - vimtutor. Той създава копие на документацията и отваря копието с vi. Можете да изпълнявате упражненията докато четете файла. Можете да стартирате vimtutor с параметър код на език и той ще стартира уроците на този език. Ако няма такива ще се стартират уроците на английски. Уроците на различни езици може да видите с командата
ls -l /usr/share/vim/vim70/tutor/tutor*.

mcedit

mcedit е текстовият редактор на Midnight Commander. Това е един от най-лесните за научаване редактори. Препоръчва се за всекидневна употреба, ако имате трудности с научаването на друг редактор.

Бързи клавиши:

  • Esc - изход от програмата, затваряне на отворен прозорец или отмяна на някакво действие
  • F1 - показва помощта.
  • F2 - запис на файла.
  • F3 - селектиране на текст. Натиснете клавиша и движете курсора със стрелките докато селектирате избрания текст. Натиснете клавиша отново, за да спрете селектирането. Натиснете два пъти клавиша без да местите курсора, за да отмените селекцията.
  • F4 - отваря диалог за търсене и замяна на текст.
  • F5 - копира селектирания текст в позицията на курсора.
  • F6 - премества селектирания текст в позицията на курсора.
  • F7 - отваря диалог за търсене на текст. Shift+F7 преминава към следващото съвпадение.
  • F8 - изтрива селектирания текст или реда в позицията на курсора.
  • F9 - отваря менюто на редактора. Избора от менюто става със стрелките и Enter.
  • F10 - изход от програмата.
  • F11 - отваря меню за избор на предефинирани действия.
  • F12 - запис на файла под ново име.

Задача: Стартирайте mcedit и създайте файл с имената на всички студенти. Използвайте функциите за замяна на текст, за да замените някои малки букви с големи. Използвайте функцията за търсене, копиране, преместване и изтриване.

nano

Nano е друг текстов редактор използващ бързи клавиши за основните действия. Някои от тях са:

  • Ctrl+O - запис на файла.
  • Ctrl+R - вмъкване съдържанието на друг файл след позицията на курсора. Използва се за отваряне на файлове.
  • Ctrl+G - показва помощта.
  • Ctrl+X - изход от програмата.
  • Ctrl+W - търсене.
  • Ctrl+C - текуща позиция на курсора.
  • Ctrl+K - изтриватекущия ред и го запазва в паметта.
  • Ctrl+U - поставя текста от паметта на текущия ред.

Този редактор е малко по-труден за научаване от mcedit. Ако имате желание да научите повече вижте вградената помощ или прочетете ръководството на адрес http://www.nano-editor.org/dist/v2.1/nano.html

Задача: Стартирайте nano и отворете помощната документация. Експериментирайте с различните бързи клавиши и действия.

emacs

Emacs е текстов редактор, който по същество представлява интерпретатор на програмния език Lisp. Сравнително труден за научаване от начинаещи потребители, но е много предпочитан от програмистите. Възможностите му за разширение са практически безгранични и от обикновен текстов редактор той се превръща в пълноценна среда за програмиране, клиент за ел. поща и др. В съвременните Линукс дистрибуции Emacs предоставя текстов и графичен режим в зависимост от инсталираните пакети. За да стартирате Emacs в текстов режим използвайте emacs-nox.

В клавишните комбинации по-долу "C" е клавиша Ctrl, а "M" (meta) обикновено е клавиша Alt.

Движение:

  • PgUp/PgDn
  • стрелките на клавиатурата или
  • C-p - нагоре (previous)
  • C-n - надолу (next)
  • C-f - напред (forward)
  • C-b - назад (backward)
  • M-f, M-b - напред и назад по думи
  • C-a, C-e - начало и край на ред
  • M-a, M-e - начало и край на изречение
  • М-<, М-> - начало и край на буфер

Повтаряне:

  • Повтаряне:C-u 6 C-b -6 знака назад
  • Хитринка на някои команди - C-u 6 + M-f, M-b - по редова, а не екрани
  • C-g - излизане от текущата команда (дори и от ESC)
  • Дълги команди - C-x комбинации, М-x цели думи
  • M-x replace string, terminal-emulator

Прозорци:

  • C-x 1 -обединява към един прозорец
  • C-x 2 - разделя хоризонтално
  • C-x 3 - разделя вертикално
  • C-x o - в другия прозорец;
  • C-x u - отмяна на последното действие (undo)
  • C-s - търсене напред
  • C-r - търсене назад
  • ESC + C-s, C-r - търсене с регулярни изрази
  • М-% - търсене и замяна
  • ESC C-% - търсене и замяна с регулярни изрази;
  • C-h - помощ

Триене:

  • Backspace - трие преди курсора, C-d - след курсора
  • М-backspace, M-d - по думи
  • C-k от курсора до нач. реда, M-k до края на текущото изречение
  • Маркиране и триене - начало на маркиране - C-<SPC> (или C-@), преместваме докъдето искаме - C-w изрязва и слага в killring, М-w - копира и слага в буфера
  • C-y - вмъква съдържимото на kill-buffer, с M-y - минаваме през kill-ring
  • C-k трие текущия ред и го вмъква в kill ring.

Файлове:

  • C-x C-f - открива файл и го зарежда в буфер
  • C-x C-s - запис на файл
  • C-x C-w - запис под друго име
  • C-x C-b - показва буферите
  • C-x b - избира буфер по име
  • Всеки файл съответства на буфер, но не всеки буфер е файл!
  • C-x s - подканва за запис на буферите
  • C-x C-c - изход от програмата

Задача: стартирайте Emacs и отворете самоучителя (C-h t). Следвайте указанията и изпълнете показаните упражнения.

ed

Ed е един от първите текстови редактори за Юникс. Това е редактор, който работи с текста по редове и се управлява чрез команди от потребителя. Такива команди например са замяна на текст. Някои команди са интерактивни като въвеждане на текст от клавиатурата. Ed рядко се използва в интерактивен режим от потребителя, по-често се използва за автоматизирано редактиране на текст от някои програми.

Т.к. ed е достатъчно сложен за начинаещи потребители, той няма да бъде разгледан в лекцията. Прочетете man ed за повече информация.

sed

Sed (stream editor) не е типичен текстов редактор. Той не може да се използва интерактивно от потребителя. Вместо това sed служи за филтриране и обработка на текст. Редакторът възприема команди, които определят какви действия ще бъдат извършени върху текста, след което извежда модифицирания текст. Ще разгледаме няколко полезни команди, могат да бъдат използвани в скриптове и програми. За повече информация вижте man sed или документацията в Интернет.

За примера ще използваме файл със следното съдържание:

cat
dog
pig
bird
horse

Замяна на текст:

$ cat animals | sed s/o/O/
cat
dOg
pig
bird
hOrse


$ cat animals | sed s/cat/elephant/
elephant
dog
pig
bird
horse

Вмъкване на текст:

$ cat animals | sed i\elephant
elephant
cat
elephant
dog
elephant
pig
elephant
bird
elephant
horse

Т.к. sed работи по редове, вмъкването се осъществява за всеки обработен ред.

Замяна на символи от едно множество със символи от друго.

$ cat animals | sed y/abcd/ABCD/
CAt
Dog
pig
BirD
horse


$ cat animals | sed y/abcd/1234/
31t
4og
pig
2ir4
horse

Sed може да приема команди записани във файл и по този начин да изпълнява произволно сложни операции върху входния текст.

Други текстообработващи команди

В тази секция са представени команди, които обработват текст. Те са неизменен помощник при администриране на компютърната система или извличане само на част от дадена информация автоматично.

awk

Awk е език за програмиране, който се фокусира върху обработката на текстови данни. Реализацията налична в Линукс се нарича Gawk като и двете команди могат да бъдат използвани. Езикът е достатъчно сложен за начинаещи и няма да бъде разглеждан в лекцията. Програмистите могат да започнат с ръководството на адрес http://www.gnu.org/software/gawk/manual/gawk.html

cut

Командата cut се използва за отделяне на секции от символи от всеки входящ ред. Най-честото и използване е за отделяне на определена секция (колона), която е оградена от един и същ ограничителен символ.

Задача: Да се определят истинските имена на потребителите на компютърната система.

Решение: Информацията за потребителските сметки е записана във файла /etc/passwd. Вижте man 5 passwd за информация относно структурата на файла. Истинското име на потребителя (ако е зададено) се записва в петото поле на всеки ред от този файл. Полетата са разделени със знака ":" (двуеточие).


$ cat /etc/passwd | cut -f5 -d:
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
gopher
FTP User
Nobody
Portmapper RPC user


NSCD Daemon
virtual console memory owner
RPC Service User
Anonymous NFS User
Privilege-separated SSH


System message bus
HAL daemon
Avahi daemon
avahi-autoipd
Apache
Named
X Font Server

Sabayon user
Alexander
Tomcat

Smolt

Задача: Да се изведе списък на обвивките, които ще се стартират при вход на всеки потребител в системата.

Решение: Отново използваме файла /etc/passwd. ИНформацията, която ни интересува е в седмото поле.

$ cat /etc/passwd | cut -f7 -d:
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin

/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/bin/sh
/sbin/nologin
/sbin/nologin
/bin/bash

grep

grep (global regular expressions printer) се използва за откриване на редове от текст, които съдържат (или не) определен регулярен израз. Регулярният израз е текст, който описва друг текст. Например *.txt, който описва всички файлове с разширение .txt. Текст, който не съдържа специални знаци (като *) е регулярен израз описващ сам себе си.

Задача: Да се изведат имената на всички потребители, които могат да влязат в системата.

Решение: За простота ще приемем, че това са потребителите чиято обвивка в /bin/bash. Отново използваме информацията от файла /etc/passwd.

$ grep "/bin/bash" /etc/passwd | cut -f1 -d:
root
alexx
student

Задача: Направете горното търсене по-точно, като изведете имената на всички потребители чиято обвивка не е /sbin/nologin. Изведете и пътя до обвивката след името на потребителя.

Решение: Използваме опцията -v, която обръща значението на търсенето. Извежда редовете, които не съвпадат с търсения израз. Освен първото поле с името на потребителя инструктираме cut да изведе и седмото, което съдържа пътя до обвивката.

$ grep -v "/sbin/nologin" /etc/passwd | cut -f1,7 -d:
root:/bin/bash
sync:/bin/sync
shutdown:/sbin/shutdown
halt:/sbin/halt
news:
alexx:/bin/bash
tomcat:/bin/sh
student:/bin/bash

Задача: Да се изведат всички редове от всички файлове в директорията /etc/init.d в които се среща текста bash.

Решение: Опцията -R инструктира grep да търси рекурсивно във всички файлове и поддиректории на директорията, зададена като параметър. Изпълнете grep "bash" -R /etc/init.d/ и наблюдавайте резултата. Пробвайте без -R.

sort

sort се използва за сортиране на входните данни. Разгледайте man sort, за различните възможности за сортиране.

Задача: Да се изведат имената на потребителите в системата в сортиран ред.

Решение: Информация за потребителите в /etc/passwd се добавя в реда на добавянето на потребителите. Използването на sort ще даде желания резултат. В случая можем да разменим местата на cut и sort, т.к. имената на потребителите са в първото поле от файла и те са уникални. Добра практика обаче е да използваме sort в последния възможен момент, т.е. когато е останала само информацията, която искаме да сортираме.

$ cat /etc/passwd | cut -f1 -d: | sort
adm
alexx
apache
avahi
avahi-autoipd
bin
daemon
dbus
ftp
games
gdm
gopher
haldaemon
halt
hsqldb
lp
mail
mailnull
named
news
nfsnobody
nobody
nscd
ntp
operator
pcap
root
rpc
rpcuser
sabayon
shutdown
smmsp
smolt
sshd
student
sync
tomcat
uucp
vcsa
xfs

Задача: Изпълнете горната задача, но подредете данните в обратен ред.

Решение: Използвайте опцията -r (reverse), за да обърнете реда на сортиране.

tr

Командата tr (translate) се използва за замяна на символи от едно множество със символи от друго (пр. малки и главни букви) или за изтриване на определени символи от входния текст.

Задача: Да се изведат имената на потребителите на системата като всички малки букви се заменят с главни.

Решение: Извикваме tr със две специални множества, за да укажем регистъра на буквите. Всеки символ от първото множество ще бъде заменен със съответния му символ от второто множество. Текстът е сортиран за по-добра четливост.

$ cat /etc/passwd | cut -f1 -d: | sort | tr [:lower:] [:upper:]
ADM
ALEXX
APACHE
AVAHI
AVAHI-AUTOIPD
BIN
DAEMON
DBUS
FTP
GAMES
GDM
GOPHER
HALDAEMON
HALT
HSQLDB
LP
MAIL
MAILNULL
NAMED
NEWS
NFSNOBODY
NOBODY
NSCD
NTP
OPERATOR
PCAP
ROOT
RPC
RPCUSER
SABAYON
SHUTDOWN
SMMSP
SMOLT
SSHD
STUDENT
SYNC
TOMCAT
UUCP
VCSA
XFS

Задача: Изпълнете горния пример отново като замените главната буква "А" с малка, а буквата "Е" с цифрата "3".

Решение: За да изпълните задачата, ще трябва да промените множествата като опишете всички букви от азбуката с изключение на "a" (т.к. в крайна сметка то остава непроменено) и да заместите "E" с "3". Този подход ще сработи, но само за латинските букви (т.к. ще опишем само тях). По-правилно е просто да разширим командата и да добавим второ извикване на tr, която ще направи размяна на двата знака. Новата команда е:
cat /etc/passwd | cut -f1 -d: | sort | tr [:lower:] [:upper:] | tr AE a3

uniq

uniq се използва за премахване на еднакви редове текст или за преброяване и извеждане на информация за това колко пъти се срещат те. Важно е да се помни, че uniq сравнява даден ред със следващия и ще работи вярно (т.е. премахване на всички повторения), само ако съдържанието е сортирано.

Задача: Да се изведат пътищата до обвивките на всички потребители като се премахнат всички повторения.

Решение: След като сме сортирали данните просто добавяме uniq в края на командите. Експериментирайте с и без sort. Махнете uniq, за да видите входните данни върху които командата оперира.

$ cat /etc/passwd | cut -f7 -d: | sort | uniq

/bin/bash
/bin/sh
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown

Задача: Изпълнете горния пример, но добавете -c към uniq, за да изведете броя на повторенията.

Задача: Да се определи колко пъти се среща дадена дума във файл.

Решение: Ще използваме набор от команди, за да разбием файла на отделни думи (отделени с интервал или нов ред), да сортираме и преброим повторенията. Добавяме и няколко команди за сортиране на изходните резултати.

for w in `cat /usr/share/doc/bash-3.2/FAQ`; do echo $w; done | sort | uniq -c | tr -s ' ' | sort -n

Ако желаете да игнорирате регистъра на буквите добавете -f към sort и -i към uniq.

wc

wc (word counter) е командата, която се използва за преброяване на редове текст, думи или символи/байтове. Използва се когато желаете да разберете колко пъти се среща даден текст. За разлика от uniq, тя отпечатва само броя на срещанията, но не и самият текст.

Задача: Да се проброят потребителите на системата.

Решение: Знаем че всеки ред от файла /etc/passwd представлява информация за един потребител. Броят на редовете е броя на потребителите. Използваме опция -l, за да проброим само редовете.

$ cat /etc/passwd | wc -l
40


Задача: Да се определи на колко реда се среща думата "bash" във файла /usr/share/doc/bash-3.2/FAQ.

Решение: Използваме grep, за да отделим само редовете съдържащи тази дума и подаваме резултата към wc.

$ grep bash /usr/share/doc/bash-3.2/FAQ | wc -l
241

Задача: Извеждане на статистическа информация за съдържанието на текстов файл.

Решение: Извикваме wc с параметър името на файла. Изведените стойности са брой редове (-l), брой думи (-w), брой байтове (-c).

$ wc /usr/share/doc/bash-3.2/FAQ 
 1841 11370 73644 /usr/share/doc/bash-3.2/FAQ
Локални линукс групи RSS
Дискусии