кодесурса
«Linux

Linux регулярные выражения

script1adsense2code
script1adsense3code

Вступление

Регулярные выражения - очень мощный инструмент в Linux. Их можно использовать с различными программами, такими как bash, vi, rename, grep, sed и другими.

Этот сеанс знакомит вас с основами регулярных выражений.

версии регулярных выражений

Существует три версии синтаксиса регулярных выражений:

BRE: Basic Regular Expressions
ERE: Extended Regular Expressions
PRCE: Perl Regular Expressions

В зависимости от используемого инструмента может использоваться один или несколько из этих синтаксисов.

Например, инструмент grep имеет опцию -E, чтобы заставить строку считываться как ERE, а -G - BRE, а -P - PRCE.

Обратите внимание, что grep als имеет -F для буквального чтения строки.

Найдите файлы типа file (не каталог, труба и т. Д.), Заканчивающиеся на .conf.

У инструмента sed также есть опции для выбора синтаксиса регулярных выражений.

Прочитайте руководство по инструментам, которые вы используете!

Grep

печатать линии, соответствующие шаблону

grep - популярный инструмент Linux для поиска строк, соответствующих определенному шаблону. Ниже приведены некоторые примеры простейших регулярных выражений.

Это содержимое текстового файла. Этот файл содержит четыре строки (или четыре символа новой строки).

datasoft @ datasoft-linux ~$ cat names.txt
Sachin
Sourav
Rahul
Binod

Когда выполняется поиск одного символа, возвращаются только строки, содержащие этот символ.

datasoft @ datasoft-linux ~$ grep c names.txt
Sachin
 datasoft @ datasoft-linux ~$ grep l names.txt
Rahul
 datasoft @ datasoft-linux ~$ grep o names.txt
Sourav
Binod

Сопоставление с образцом в этом примере должно быть очень простым; если данный символ встречается в строке, то grep вернет эту строку.

объединяющие символы

Два соединенных символа должны быть соединены одинаковым образом для совпадения.

Этот пример демонстрирует, что hi будет соответствовать Sachin, но не Sourav, а Rahual Bi будет соответствовать Vonod, но не Sachin и Sourav.

datasoft @ datasoft-linux ~$ grep a names.txt
Sachin
Sourav
Rahul
 datasoft @ datasoft-linux ~$ grep hi names.txt
Sachin
 datasoft @ datasoft-linux ~$ grep Bi names.txt
Binod
 datasoft @ datasoft-linux ~$

один или другой

PRCE и ERE используют символ канала для обозначения ИЛИ. В этом примере мы grep для строк, содержащих букву i или букву a.

 datasoft @ datasoft-linux ~$ cat names.txt
Sachin
Sourav
Rahul
Binod
 datasoft @ datasoft-linux ~$ grep -E 'i|u' names.txt
Sachin
Sourav
Rahul
Binod
 datasoft @ datasoft-linux ~$ grep -E 'i|o' names.txt
Sachin
Sourav
Binod

Обратите внимание, что мы используем ключ -E grep, чтобы заставить интерпретировать нашу строку как ERE.

Нам нужно экранировать символ канала в BRE, чтобы получить то же логическое ИЛИ.

 datasoft @ datasoft-linux ~$ grep -G 'i|u' names.txt
 datasoft @ datasoft-linux ~$ grep -G 'i\|u' names.txt
Sachin
Sourav
Rahul
Binod

один или больше

Знак * означает ноль, один или несколько вхождений предыдущего, а знак + означает один или несколько предыдущих.

datasoft @ datasoft-linux ~$ cat abc1.txt
11
101
1001
10001
 datasoft @ datasoft-linux ~$ grep -E '0*' abc1.txt
11
101
1001
10001
 datasoft @ datasoft-linux ~$ grep -E '0+' abc1.txt
101
1001
10001
 datasoft @ datasoft-linux ~$
 

соответствует концу строки

Для следующих примеров мы будем использовать этот файл.

datasoft @ datasoft-linux ~$ cat names.txt
Sachin
Sourav
Rahul
Binod
datasoft @ datasoft-linux ~$

Два приведенных ниже примера показывают, как использовать символ доллара для соответствия концу строки.

datasoft @ datasoft-linux ~$ grep n$ names.txt
Sachin
 datasoft @ datasoft-linux ~$ grep d$ names.txt
Binod

сопоставить начало строки

Символ каретки (^) будет соответствовать строке в начале (или начале) строки.

Учитывая тот же файл, что и выше, вот два примера.

datasoft @ datasoft-linux ~$ grep ^Sac names.txt
Sachin
 datasoft @ datasoft-linux ~$ grep ^S names.txt
Sachin
Sourav

И знак доллара, и маленькая шапочка в регулярном выражении называются якорями.

разделяющие слова

Регулярные выражения используют последовательность для ссылки на разделитель слов. Возьмите для примера этот файл:

 datasoft @ datasoft-linux ~$ cat summer.txt
The sun shine very brightly.
It is sunny day.
Is the flower beautiful?

Простое совпадение даст слишком много результатов.

datasoft @ datasoft-linux ~$ grep day summer.txt
It is sunny day.

Окружение искомого слова пробелами не является хорошим решением (потому что другие символы могут быть разделителями слов). Этот экран ниже показывает, как использовать только для поиска искомого слова:

datasoft @ datasoft-linux ~$ grep '\bday\b' summer.txt
It is sunny day.
 datasoft @ datasoft-linux ~$ 
 

Обратите внимание, что у grep также есть опция -w для grep для слов.

datasoft @ datasoft-linux ~$ cat summer.txt
The sun shine very brightly.
It is sunny day.
Is the flower beautiful?
 datasoft @ datasoft-linux ~$ grep -w day summer.txt
It is sunny day.
 datasoft @ datasoft-linux ~$

особенности grep

Иногда проще объединить простое регулярное выражение с опциями grep, чем написать более сложное регулярное выражение. Эти варианты обсуждались ранее:

grep -i
grep -v
grep -w
grep -A5
grep -B5
grep -C5

предотвращение расширения оболочки регулярного выражения

Знак доллара - это специальный символ, как для регулярного выражения, так и для оболочки (помните переменные и встроенные оболочки). Поэтому рекомендуется всегда указывать регулярное выражение, это предотвращает расширение оболочки.

datasoft @ datasoft-linux ~$ grep 'l$' names.txt
Rahul

переименовать

команда переименования

В Debian Linux команда / usr / bin / rename представляет собой ссылку на / usr / bin / prename, установленную пакетом perl.

 datasoft @ datasoft-linux ~$ dpkg -S $(readlink -f $(which rename))
perl: /usr/bin/prename

Производные системы Red Hat не устанавливают одну и ту же команду переименования, поэтому в этом разделе не описывается переименование в Red Hat (если только вы не скопируете скрипт perl вручную).

В Интернете часто возникает путаница по поводу команды переименования, потому что решения, которые отлично работают в Debian (и Ubuntu, xubuntu, Mint, ...), не могут использоваться в Red Hat (и CentOS, Fedora, ...).

Perl

Команда переименования на самом деле является сценарием perl, который использует регулярные выражения perl. Полное руководство для них можно найти, набрав perldoc perlrequick (после установки perldoc).

datasoft @ datasoft-linux ~$ sudo apt-get install perl-doc
[sudo] password for datasoft: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  groff
The following NEW packages will be installed:
  perl-doc
0 upgraded, 1 newly installed, 0 to remove and 364 not upgraded.
Need to get 7,266 kB of archives.
After this operation, 13.1 MB of additional disk space will be used.
Get:1 http://in.archive.ubuntu.com/ubuntu/ trusty/main perl-doc all 5.18.2-2ubuntu1 [7,266 kB]
Fetched 7,266 kB in 2min 7s (57.0 kB/s)                                        
Selecting previously unselected package perl-doc.
(Reading database ... 171435 files and directories currently installed.)
Preparing to unpack .../perl-doc_5.18.2-2ubuntu1_all.deb ...
Adding 'diversion of /usr/bin/perldoc to /usr/bin/perldoc.stub by perl-doc'
Unpacking perl-doc (5.18.2-2ubuntu1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Setting up perl-doc (5.18.2-2ubuntu1) ...
datasoft @ datasoft-linux ~$ perldoc perlrequick

хорошо известный синтаксис

Наиболее распространенное использование переименования - это поиск имен файлов, соответствующих определенной строке, и замена этой строки другой строкой.

Это часто представляется как s / string / other string /, как показано в этом примере:

datasoft @ datasoft-linux ~$ ls
abc1                                names.txt
abc1.txt                            out_and_err
ABC.png                             part1
abc.txt                             part2
ajax-php-mysql-user-interface.html  part3
allfiles.txt                        Pictures
count                               png
cricket.txt                         pqr.txt
Desktop                             pqr.txt~
Documents                           Public
Downloads                           sample.txt
etcfiles.txt                        sqlite3
examples.desktop                    sqlite-amalgamation-3080500 (2)
file1.txt                           sqlite-amalgamation-3080500.zip
file2                               sqlite-shell-linux-x86-3080500.zip
FileA                               summer.png
FileB                               Summer.png
foo                                 summer.txt
football.txt                        summer.txt~
lebel1.txt                          Templates
lebel1.txt~                         temp.txt.bz2
lebel2.txt                          test1
lebel.txt                           test10
linux-command-past-date.png         test2
mno.txt                             text2
Music                               typescript
MyDir                               Untitled 1.odt
MyDir1                              Untitled Document~
MyDirA                              Videos
Myfile1.doc                         wrong.txt
MYFILE1.doc                         wrong.txtclear
MYFILE2.doc                         xyz.txt
MyTest                              xyz.txt~
 datasoft @ datasoft-linux ~$ rename 's/txt/text/' *
 datasoft @ datasoft-linux ~$ ls
abc1                                names.text
abc1.text                           out_and_err
ABC.png                             part1
abc.text                            part2
ajax-php-mysql-user-interface.html  part3
allfiles.text                       Pictures
count                               png
cricket.text                        pqr.text
Desktop                             pqr.text~
Documents                           Public
Downloads                           sample.text
etcfiles.text                       sqlite3
examples.desktop                    sqlite-amalgamation-3080500 (2)
file1.text                          sqlite-amalgamation-3080500.zip
file2                               sqlite-shell-linux-x86-3080500.zip
FileA                               summer.png
FileB                               Summer.png
foo                                 summer.text
football.text                       summer.text~
lebel1.text                         Templates
lebel1.text~                        temp.text.bz2
lebel2.text                         test1
lebel.text                          test10
linux-command-past-date.png         test2
mno.text                            TXT2
Music                               typescript
MyDir                               Untitled 1.odt
MyDir1                              Untitled Document~
MyDirA                              Videos
Myfile1.doc                         wrong.text
MYFILE1.doc                         wrong.textclear
MYFILE2.doc                         xyz.text
MyTest                              xyz.text~

А вот еще один пример, который использует переименование с хорошо известным синтаксисом, чтобы еще раз изменить расширения тех же файлов:

datasoft @ datasoft-linux ~$ ls
abc1                                names.text
abc1.text                           out_and_err
ABC.png                             part1
abc.text                            part2
ajax-php-mysql-user-interface.html  part3
allfiles.text                       Pictures
count                               png
cricket.text                        pqr.text
Desktop                             pqr.text~
Documents                           Public
Downloads                           sample.text
etcfiles.text                       sqlite3
examples.desktop                    sqlite-amalgamation-3080500 (2)
file1.text                          sqlite-amalgamation-3080500.zip
file2                               sqlite-shell-linux-x86-3080500.zip
FileA                               summer.png
FileB                               Summer.png
foo                                 summer.text
football.text                       summer.text~
lebel1.text                         Templates
lebel1.text~                        temp.text.bz2
lebel2.text                         test1
lebel.text                          test10
linux-command-past-date.png         test2
mno.text                            TXT2
Music                               typescript
MyDir                               Untitled 1.odt
MyDir1                              Untitled Document~
MyDirA                              Videos
Myfile1.doc                         wrong.text
MYFILE1.doc                         wrong.textclear
MYFILE2.doc                         xyz.text
MyTest                              xyz.text~
 datasoft @ datasoft-linux ~$ rename 's/text/txt/' *.text
 datasoft @ datasoft-linux ~$ ls
abc1                                names.txt
abc1.txt                            out_and_err
ABC.png                             part1
abc.txt                             part2
ajax-php-mysql-user-interface.html  part3
allfiles.txt                        Pictures
count                               png
cricket.txt                         pqr.text~
Desktop                             pqr.txt
Documents                           Public
Downloads                           sample.txt
etcfiles.txt                        sqlite3
examples.desktop                    sqlite-amalgamation-3080500 (2)
file1.txt                           sqlite-amalgamation-3080500.zip
file2                               sqlite-shell-linux-x86-3080500.zip
FileA                               summer.png
FileB                               Summer.png
foo                                 summer.text~
football.txt                        summer.txt
lebel1.text~                        Templates
lebel1.txt                          temp.text.bz2
lebel2.txt                          test1
lebel.txt                           test10
linux-command-past-date.png         test2
mno.txt                             TXT2
Music                               typescript
MyDir                               Untitled 1.odt
MyDir1                              Untitled Document~
MyDirA                              Videos
Myfile1.doc                         wrong.textclear
MYFILE1.doc                         wrong.txt
MYFILE2.doc                         xyz.text~
MyTest                              xyz.txt
 datasoft @ datasoft-linux ~$ 

Эти два примера работают, потому что используемые нами строки существуют только в конце имени файла. Помните, что расширения файлов не имеют смысла в оболочке bash.

Следующий пример показывает, что может пойти не так с этим синтаксисом.

datasoft @ datasoft-linux ~$ touch xyz.txt
 datasoft @ datasoft-linux ~$ rename 's/xyz/problem/' xyz.txt
 datasoft @ datasoft-linux ~$ ls
abc1                                names.txt
abc1.txt                            out_and_err
ABC.png                             part1
abc.txt                             part2
ajax-php-mysql-user-interface.html  part3
allfiles.txt                        Pictures
count                               png
cricket.txt                         pqr.text~
Desktop                             pqr.txt
Documents                           problem.txt
Downloads                           Public
etcfiles.txt                        sample.txt
examples.desktop                    sqlite3
file1.txt                           sqlite-amalgamation-3080500 (2)
file2                               sqlite-amalgamation-3080500.zip
FileA                               sqlite-shell-linux-x86-3080500.zip
FileB                               summer.png
foo                                 Summer.png
football.txt                        summer.text~
lebel1.text~                        summer.txt
lebel1.txt                          Templates
lebel2.txt                          temp.text.bz2
lebel.txt                           test1
linux-command-past-date.png         test10
mno.txt                             test2
Music                               TXT2
MyDir                               typescript
MyDir1                              Untitled 1.odt
MyDirA                              Untitled Document~
Myfile1.doc                         Videos
MYFILE1.doc                         wrong.textclear
MYFILE2.doc                         wrong.txt
MyTest                              xyz.text~
datasoft @ datasoft-linux ~$ 

Только первое вхождение искомой строки заменяется.

глобальная замена

Синтаксис, использованный в предыдущем примере, можно описать как s / regex / replace /. Это просто и понятно, вы вводите регулярное выражение между первыми двумя косыми чертами и заменяющую строку между последними двумя.

Этот пример лишь немного расширяет этот синтаксис, добавляя модификатор.

datasoft @ datasoft-linux ~$ rename -n 's/TXT2/txt/g' aTXT2.TXT
aTXT2.TXT renamed as atxt.TXT
 datasoft @ datasoft-linux ~$ 
 
 

Синтаксис, который мы используем сейчас, может быть описан как s / regex / replace / g, где s обозначает switch, а g обозначает global.

Обратите внимание, что в этом примере используется ключ -n, чтобы показать, что делается (вместо фактического переименования файла).

замена без учета регистра

Еще один полезный модификатор - это i. В этом примере показано, как заменить строку без учета регистра другой строкой.

datasoft @ datasoft-linux ~$ rename 's/.TXT$/.txt/' *.TXT datasoft @ datasoft-linux ~$ ls *.txt
abc1.txt      file1.txt     mno.txt     wrong.txt
abc.txt       football.txt  names.txt   xyz.txt
allfiles.txt  lebel1.txt    pqr.txt
cricket.txt   lebel2.txt    sample.txt
etcfiles.txt  lebel.txt     summer.txt
 datasoft @ datasoft-linux ~$

переименование расширений

Командная строка Linux не знает о расширениях, подобных MS-DOS, но многие конечные пользователи и графические приложения используют их.

Вот пример того, как использовать переименование, чтобы переименовать только расширение файла. Он использует знак доллара, чтобы отметить окончание имени файла.

datasoft @ datasoft-linux ~$ ls *.txt
abc1.txt      file1.txt     mno.txt     wrong.txt
abc.txt       football.txt  names.txt   xyz.txt
allfiles.txt  lebel1.txt    pqr.txt
cricket.txt   lebel2.txt    sample.txt
etcfiles.txt  lebel.txt     summer.txt
datasoft @ datasoft-linux ~$ rename 's/.txt$/.TXT/' *.txt datasoft @ datasoft-linux ~$ ls *.TXT
abc1.TXT      file1.TXT     mno.TXT     wrong.TXT
abc.TXT       football.TXT  names.TXT   xyz.TXT
allfiles.TXT  lebel1.TXT    pqr.TXT
cricket.TXT   lebel2.TXT    sample.TXT
etcfiles.TXT  lebel.TXT     summer.TXT
 datasoft @ datasoft-linux ~$

Обратите внимание, что знак доллара в регулярном выражении означает в конце. Без знака доллара эта команда не будет выполнена в файле действительно.txt.txt.

СЕПГ

редактор потоков

Редактор потока или short sed использует регулярное выражение для редактирования потока.

В этом примере sed используется для замены строки.

datasoft @ datasoft-linux ~$ echo Sunday
Sunday
 datasoft @ datasoft-linux ~$ echo Sunday | sed 's/Sun/Mon/'
Monday
 datasoft @ datasoft-linux ~$

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

datasoft @ datasoft-linux ~$ echo Sunday
Sunday
 datasoft @ datasoft-linux ~$ echo Sunday | sed 's:Sun:Mon:'
Monday
 datasoft @ datasoft-linux ~$ echo Sunday | sed 's_Sun_Mon_'
Monday
 datasoft @ datasoft-linux ~$ echo Sunday | sed 's|Sun|Mon|'
Monday
 datasoft @ datasoft-linux ~$

интерактивный редактор

Хотя sed предназначен для использования в потоке, он также может использоваться в интерактивном режиме для файла.

datasoft @ datasoft-linux ~$ echo Sunday > today
 datasoft @ datasoft-linux ~$ cat today
Sunday
 datasoft @ datasoft-linux ~$ sed -i 's/Sun/Mon/' today
 datasoft @ datasoft-linux ~$ cat today
Monday
 datasoft @ datasoft-linux ~$
 

простая обратная ссылка

Символ амперсанда может использоваться для ссылки на искомую (и найденную) строку.

В этом примере амперсанд используется для удвоения числа найденных строк.

datasoft @ datasoft-linux ~$ echo Sunday | sed 's/Sun/&&/'
SunSunday
 datasoft @ datasoft-linux ~$ echo Sunday | sed 's/day/&&/'
Sundayday
 datasoft @ datasoft-linux ~$ 

обратная ссылка

Круглые скобки (часто называемые круглыми скобками) используются для группировки разделов регулярного выражения, чтобы впоследствии на них можно было ссылаться.

Рассмотрим этот простой пример:

datasoft @ datasoft-linux ~$ echo Sunday | sed 's_\(Sun\)_\1ny_'
Sunnyday
 datasoft @ datasoft-linux ~$ echo Sunday | sed 's_\(Sun\)_\1ny \1_'
Sunny Sunday

точка для любого персонажа

В регулярном выражении простая точка может обозначать любой символ.

datasoft @ datasoft-linux ~$ echo 2014-08-09 | sed 's/....-..-../YYYY-MM-DD/'
YYYY-MM-DD
 datasoft @ datasoft-linux ~$ echo mnop-qr-st | sed 's/....-..-../YYYY-MM-DD/'
YYYY-MM-DD
 datasoft @ datasoft-linux ~$
 

множественные обратные ссылки

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

datasoft @ datasoft-linux ~$ echo 2014-08-11 | sed 's/\(....\)-\(..\)-\(..\)/\1+\2+\3/'
2014+08+11
 datasoft @ datasoft-linux ~$ echo 2014-04-01 | sed 's/\(....\)-\(..\)-\(..\)/\3:\2:\1/'
01:04:2014
 datasoft @ datasoft-linux ~$

Эта функция называется группировкой.

пустое пространство

S может означать пробел, такой как пробел или табуляция.

Этот пример ищет пробелы в глобальном масштабе и заменяет их на 1 пробел.

datasoft @ datasoft-linux ~$ echo -e 'today\tis\thot'today	is	hot
 datasoft @ datasoft-linux ~$ echo -e 'today\tis\thot' | sed 's_\s_ _g'
today is hot
 datasoft @ datasoft-linux ~$

необязательное вхождение

Знак вопроса означает, а предыдущий не является обязательным.

В приведенном ниже примере выполняется поиск трех последовательных букв o, но третий o является необязательным.

datasoft @ datasoft-linux ~$ cat abc1.txt
11
101
1001
10001
 datasoft @ datasoft-linux ~$ grep -E '000?' abc1.txt
1001
10001
 datasoft @ datasoft-linux ~$ cat abc1 | sed 's/000\?/A/'
11
101
1A1
1A1
 datasoft @ datasoft-linux ~$

ровно n раз

Вы можете требовать точное количество раз, когда произошло предварительное событие. Этот пример хочет ровно три часа.

datasoft @ datasoft-linux ~$ cat abc1.txt
11
101
1001
10001
 datasoft @ datasoft-linux ~$ grep -E '0{3}' abc1.txt
10001
 datasoft @ datasoft-linux ~$ cat abc1.txt | sed 's/0\{3\}/A/'
11
101
1001
1A1
 datasoft @ datasoft-linux ~$

между n и m раз

И здесь мы требуем ровно от 2 до 3 раз.

datasoft @ datasoft-linux ~$ cat abc1.txt
11
101
1001
10001
 datasoft @ datasoft-linux ~$ grep -E '0{2,3}' abc1.txt1001
10001
 datasoft @ datasoft-linux ~$ grep '0\{2,3\}' abc1.txt
1001
10001
 datasoft @ datasoft-linux ~$ cat abc1.txt | sed 's/0\{2,3\}/A/'
11
101
1A1
1A1
 datasoft @ datasoft-linux ~$

история Баш

Оболочка bash также может интерпретировать некоторые регулярные выражения. В этом примере показано, как управлять функцией истории восклицательных масок из оболочки bash.

 datasoft @ datasoft-linux ~$ mkdir history
 datasoft @ datasoft-linux ~$ cd history/
datasoft @ datasoft-linux ~/history$ touch lebel1 lebel2 lebel3
 datasoft @ datasoft-linux ~/history$ ls -l lebel1
-rw-rw-r-- 1 datasoft datasoft 0 Aug 12 17:59 lebel1
 datasoft @ datasoft-linux ~/history$ !l
ls -l lebel1
-rw-rw-r-- 1 datasoft datasoft 0 Aug 12 17:59 lebel1
 datasoft @ datasoft-linux ~/history$  !l:s/1/3
l:s/3/3 :s/l/3 :s/l/3 :s/1/3
bash: l:s/3/3: No such file or directory
 datasoft @ datasoft-linux ~/history$

Это также работает с историческими числами в bash.

 datasoft @ datasoft-linux ~/history$ history 6
 1924  l:s/3/3 :s/l/3
 1925  clear
 1926  l:s/3/3 :s/l/3 :s/l/3
 1927  l:s/3/3 :s/l/3 :s/l/3 :s/1/3
 1928  clear
 1929  history 6
 datasoft @ datasoft-linux ~/history$ !1929
history 6
 1927  l:s/3/3 :s/l/3 :s/l/3 :s/1/3
 1928  clear
 1929  history 6
 1930  l:s/3/3 :s/l/3 :s/l/3 :s/1/3
 1931  clear
 1932  history 6
 datasoft @ datasoft-linux ~/history$ !1929:s/1/2bash: :s/1/2: substitution failed
 datasoft @ datasoft-linux ~/history$
 

Предыдущий: Linux Basic Unix инструменты
Далее: пользователи Linux

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code