Linux регулярные выражения
Вступление
Регулярные выражения - очень мощный инструмент в 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 программирования