SED — различия между версиями
Root (обсуждение | вклад) |
Root (обсуждение | вклад) |
||
(не показано 20 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | '''Замена''' | |
− | |||
− | |||
Заменить в строке ТЕКСТ1 на ТЕКСТ2. По умолчанию команда sed заменяет первое вхождение шаблона в каждой строке, не затрагивая второе, третье и т.д.(если в строке будет несколько текст1, то заменится только первый) | Заменить в строке ТЕКСТ1 на ТЕКСТ2. По умолчанию команда sed заменяет первое вхождение шаблона в каждой строке, не затрагивая второе, третье и т.д.(если в строке будет несколько текст1, то заменится только первый) | ||
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | ||
− | |||
Замена n-ого вхождения шаблона в строке. Вхождения, которые нужно заменить, обозначаются с помощью флагов /1, /2 и т.д. | Замена n-ого вхождения шаблона в строке. Вхождения, которые нужно заменить, обозначаются с помощью флагов /1, /2 и т.д. | ||
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/2' filename | sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/2' filename | ||
− | |||
Для замены всех без исключения вхождений заданного шаблона используется глобальный флаг /g | Для замены всех без исключения вхождений заданного шаблона используется глобальный флаг /g | ||
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/g' filename | sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/g' filename | ||
− | |||
Замена всех вхождений шаблона в строке начиная с n-ого. Для этого номер вхождения, с которого нужно начать, сопровождается флагом g. Следующая команда заменит в каждой строке третье, четвёртое и т.д. вхождение | Замена всех вхождений шаблона в строке начиная с n-ого. Для этого номер вхождения, с которого нужно начать, сопровождается флагом g. Следующая команда заменит в каждой строке третье, четвёртое и т.д. вхождение | ||
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/3g' filename | sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/3g' filename | ||
− | |||
Заключение первых символов слов в скобки | Заключение первых символов слов в скобки | ||
echo "Welcome To The Moscow" | sed 's/<font color=blue>\(\b[A-Z]\)</font>/<font color=blue>\(\1\)</font>/g' | echo "Welcome To The Moscow" | sed 's/<font color=blue>\(\b[A-Z]\)</font>/<font color=blue>\(\1\)</font>/g' | ||
+ | или | ||
+ | echo "Welcome To The Moscow" | sed 's/<font color=blue>\b[A-Z]/(&)</font>/g' | ||
(W)elcome (T)o (T)he (M)oscow | (W)elcome (T)o (T)he (M)oscow | ||
+ | Замена шаблона другим шаблоном, за исключением строки n | ||
+ | sed 'n!s/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | ||
Замена шаблона в конкретной строке. В данном случае заменяет заданное слово только в третьей строке | Замена шаблона в конкретной строке. В данном случае заменяет заданное слово только в третьей строке | ||
sed '3 s/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | sed '3 s/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | ||
+ | Замена нескольких пробелов одним | ||
+ | sed '<font color=blue>s/ */ /g</font>' filename | ||
Дублирование изменяемых строк. При добавлении флага /p команда выведет в терминал строки, где производится замена. Строки, в которых искомый шаблон отсутствует, не дублируются | Дублирование изменяемых строк. При добавлении флага /p команда выведет в терминал строки, где производится замена. Строки, в которых искомый шаблон отсутствует, не дублируются | ||
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/p' filename | sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/p' filename | ||
− | |||
Вывод только строк с заменой. Если рядом с флагом /p добавить ключ -n, в терминале отобразятся только строки, где выполнялась замена. В данном случае -n отключает дублирующее поведение флага /p, поэтому строки с заменой выводятся по одному разу | Вывод только строк с заменой. Если рядом с флагом /p добавить ключ -n, в терминале отобразятся только строки, где выполнялась замена. В данном случае -n отключает дублирующее поведение флага /p, поэтому строки с заменой выводятся по одному разу | ||
sed -n 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/p' filename | sed -n 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/p' filename | ||
− | |||
Замена шаблона в указанном диапазоне строк. Можно указывать диапазон строк, в которых требуется заменить определённый шаблон. Здесь производится замена в строках с 1 по 3 | Замена шаблона в указанном диапазоне строк. Можно указывать диапазон строк, в которых требуется заменить определённый шаблон. Здесь производится замена в строках с 1 по 3 | ||
sed '1,3 s/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | sed '1,3 s/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | ||
+ | |||
+ | Здесь $ указывает на последнюю строку файла, в связи с чем заменяются первые вхождения шаблона, начиная со второй и заканчивая ей | ||
+ | sed '2,$ s/<font color=blue>текст1</font>/<font color=red>текст2</font>/' filename | ||
+ | |||
+ | |||
+ | '''Удаление строк из файла''' | ||
+ | |||
+ | Удаление n-ой строки | ||
+ | sed '<font color=blue>nd</font>' filename | ||
+ | |||
+ | Удаление последней строки | ||
+ | sed '<font color=blue>$d</font>' filename | ||
+ | |||
+ | Удаление строк с x по y | ||
+ | sed '<font color=blue>x,yd</font>' filename | ||
+ | |||
+ | Удаление строк с n-ой до последней | ||
+ | sed '<font color=blue>n,$d</font>' filename | ||
+ | |||
+ | Удаление текста, соответствующего шаблону | ||
+ | sed '/<font color=blue>abc</font>/d' filename | ||
+ | |||
+ | Удалить каждую вторую строку начиная с n-ой | ||
+ | sed '<font color=blue>n~2d</font>' filename | ||
+ | |||
+ | Удалить строки, содержащие шаблон, и по две строки после них | ||
+ | sed '<font color=blue>/pattern/,+2d</font>' filename | ||
+ | |||
+ | Удалить пустые строки или начинающиеся с # | ||
+ | sed -i '<font color=blue>/^#/d;/^$/d</font>' filename | ||
+ | |||
+ | |||
+ | '''Добавление/удаление пустых строк в файле''' | ||
+ | |||
+ | Вставить после каждой текстовой строки одну пустую | ||
+ | sed <font color=blue>G</font> filename | ||
+ | |||
+ | Вставить две пустые строки | ||
+ | sed '<font color=blue>G;G</font>' filename | ||
+ | |||
+ | Удалить все пустые строки и вставить по одной после каждой текстовой | ||
+ | sed '<font color=blue>/^$/d;G</font>' filename | ||
+ | |||
+ | Вставить пустую строку над каждой, содержащей word | ||
+ | sed '<font color=blue>/word/{x;p;x;}</font>' filename | ||
+ | |||
+ | Вставить пустую строку после каждой, содержащей word | ||
+ | sed '<font color=blue>/word/G</font>' filename | ||
+ | |||
+ | Вставить 5 пробелов слева от каждой строки | ||
+ | sed '<font color=blue>s/^/ /</font>' filename | ||
+ | |||
+ | |||
+ | '''Нумерация строк''' | ||
+ | |||
+ | Пронумеровать каждую строку файла (с левым выравниванием). Символ = используется для нумерации строки, а флаг \t для табулирования между номером и предложением | ||
+ | sed = filename | sed '<font color=blue>N;s/\n/\t/</font>' | ||
+ | |||
+ | Пронумеровать каждую строку файла (число слева, выравнивание по правому краю) | ||
+ | sed = filename | sed '<font color=blue>N; s/^/ /; s/ *\(.\{4,\}\)\n/\1 /</font>' | ||
+ | |||
+ | Пронумеровать каждую непустую строку файла | ||
+ | sed '<font color=blue>/./=</font>' filename | sed '<font color=blue>/./N; s/\n/ /</font>' | ||
+ | |||
+ | |||
+ | '''Просмотр/вывод строк''' | ||
+ | |||
+ | Просмотреть файл со строки x по y | ||
+ | sed -n '<font color=blue>x,yp</font>' filename | ||
+ | |||
+ | Просмотреть весь файл, за исключением заданного диапазона | ||
+ | sed '<font color=blue>x,yd</font>' filename | ||
+ | |||
+ | Вывести только первую и последнюю строки | ||
+ | sed -n '<font color=blue>1p;$p</font>' filename | ||
+ | |||
+ | Вывести n-ую строку файла. В данном случае четвертую | ||
+ | sed -n '<font color=blue>4</font>'p filename | ||
+ | |||
+ | Вывести только последнюю строку | ||
+ | sed -n '<font color=blue>$</font>'p filename | ||
+ | |||
+ | Вывести с n-ой строки до последней | ||
+ | sed -n '<font color=blue>n,$p</font>' filename | ||
+ | |||
+ | Вывести строки, содержащие указанный шаблон | ||
+ | sed -n /<font color=blue>pattern</font>/p filename | ||
+ | |||
+ | Вывести строки начиная с первой, где обнаружен шаблон, и до строки x | ||
+ | sed -n '<font color=blue>/pattern/,xp</font>' filename | ||
+ | В данном случае первое вхождение pattern содержится в строке 3, значит в терминале отобразятся строки с 3 по 5. Если нужно вывести файл до конца, используйте вместо 5 символ $ | ||
+ | |||
+ | Вывести строки с x и до строки, содержащей шаблон. Если шаблон не обнаруживается, выводится файл до конца | ||
+ | sed -n '<font color=blue>x,/pattern/p</font>' filename | ||
+ | |||
+ | Вывести все строки, содержащие шаблон, включая следующие за каждой из них x строк | ||
+ | sed -n '<font color=blue>/pattern/,+xp</font>' filename | ||
+ | |||
+ | |||
+ | |||
Строка 43: | Строка 141: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Требуется поставить символ # перед всеми ttyv, кроме ttyv0 | + | Требуется поставить символ # перед всеми ttyv, кроме ttyv0 |
− | sed 's/^ttyv[1-8]/#&/' /etc/ttys | + | sed 's/<font color=blue>^ttyv[1-8]/#&</font>/' /etc/ttys |
+ | ttyv0 "/usr/libexec/getty Pc" | ||
+ | #ttyv1 "/usr/libexec/getty Pc" | ||
+ | #ttyv8 "/usr/libexec/getty Pc" | ||
Отслеживаем логи через tail -f. Для удобства отображения хотелось бы после каждой строки добавлять пустую строку. | Отслеживаем логи через tail -f. Для удобства отображения хотелось бы после каждой строки добавлять пустую строку. | ||
Надо в конце строки вставлять символ перевода строки \n. Якорем(метасимволом, квантификатором), обозначающим конец строки, в большинстве диалектов регулярных выражений обычно служит символ $: | Надо в конце строки вставлять символ перевода строки \n. Якорем(метасимволом, квантификатором), обозначающим конец строки, в большинстве диалектов регулярных выражений обычно служит символ $: | ||
− | tail -f access.log | sed 's/$/\n/' | + | tail -f access.log | sed 's//<font color=blue>$/\n/</font>' |
− | |||
− | |||
− | |||
− |
Текущая версия на 00:36, 1 июня 2022
Замена
Заменить в строке ТЕКСТ1 на ТЕКСТ2. По умолчанию команда sed заменяет первое вхождение шаблона в каждой строке, не затрагивая второе, третье и т.д.(если в строке будет несколько текст1, то заменится только первый)
sed 's/текст1/текст2/' filename
Замена n-ого вхождения шаблона в строке. Вхождения, которые нужно заменить, обозначаются с помощью флагов /1, /2 и т.д.
sed 's/текст1/текст2/2' filename
Для замены всех без исключения вхождений заданного шаблона используется глобальный флаг /g
sed 's/текст1/текст2/g' filename
Замена всех вхождений шаблона в строке начиная с n-ого. Для этого номер вхождения, с которого нужно начать, сопровождается флагом g. Следующая команда заменит в каждой строке третье, четвёртое и т.д. вхождение
sed 's/текст1/текст2/3g' filename
Заключение первых символов слов в скобки
echo "Welcome To The Moscow" | sed 's/\(\b[A-Z]\)/\(\1\)/g' или echo "Welcome To The Moscow" | sed 's/\b[A-Z]/(&)/g' (W)elcome (T)o (T)he (M)oscow
Замена шаблона другим шаблоном, за исключением строки n
sed 'n!s/текст1/текст2/' filename
Замена шаблона в конкретной строке. В данном случае заменяет заданное слово только в третьей строке
sed '3 s/текст1/текст2/' filename
Замена нескольких пробелов одним
sed 's/ */ /g' filename
Дублирование изменяемых строк. При добавлении флага /p команда выведет в терминал строки, где производится замена. Строки, в которых искомый шаблон отсутствует, не дублируются
sed 's/текст1/текст2/p' filename
Вывод только строк с заменой. Если рядом с флагом /p добавить ключ -n, в терминале отобразятся только строки, где выполнялась замена. В данном случае -n отключает дублирующее поведение флага /p, поэтому строки с заменой выводятся по одному разу
sed -n 's/текст1/текст2/p' filename
Замена шаблона в указанном диапазоне строк. Можно указывать диапазон строк, в которых требуется заменить определённый шаблон. Здесь производится замена в строках с 1 по 3
sed '1,3 s/текст1/текст2/' filename
Здесь $ указывает на последнюю строку файла, в связи с чем заменяются первые вхождения шаблона, начиная со второй и заканчивая ей
sed '2,$ s/текст1/текст2/' filename
Удаление строк из файла
Удаление n-ой строки
sed 'nd' filename
Удаление последней строки
sed '$d' filename
Удаление строк с x по y
sed 'x,yd' filename
Удаление строк с n-ой до последней
sed 'n,$d' filename
Удаление текста, соответствующего шаблону
sed '/abc/d' filename
Удалить каждую вторую строку начиная с n-ой
sed 'n~2d' filename
Удалить строки, содержащие шаблон, и по две строки после них
sed '/pattern/,+2d' filename
Удалить пустые строки или начинающиеся с #
sed -i '/^#/d;/^$/d' filename
Добавление/удаление пустых строк в файле
Вставить после каждой текстовой строки одну пустую
sed G filename
Вставить две пустые строки
sed 'G;G' filename
Удалить все пустые строки и вставить по одной после каждой текстовой
sed '/^$/d;G' filename
Вставить пустую строку над каждой, содержащей word
sed '/word/{x;p;x;}' filename
Вставить пустую строку после каждой, содержащей word
sed '/word/G' filename
Вставить 5 пробелов слева от каждой строки
sed 's/^/ /' filename
Нумерация строк
Пронумеровать каждую строку файла (с левым выравниванием). Символ = используется для нумерации строки, а флаг \t для табулирования между номером и предложением
sed = filename | sed 'N;s/\n/\t/'
Пронумеровать каждую строку файла (число слева, выравнивание по правому краю)
sed = filename | sed 'N; s/^/ /; s/ *\(.\{4,\}\)\n/\1 /'
Пронумеровать каждую непустую строку файла
sed '/./=' filename | sed '/./N; s/\n/ /'
Просмотр/вывод строк
Просмотреть файл со строки x по y
sed -n 'x,yp' filename
Просмотреть весь файл, за исключением заданного диапазона
sed 'x,yd' filename
Вывести только первую и последнюю строки
sed -n '1p;$p' filename
Вывести n-ую строку файла. В данном случае четвертую
sed -n '4'p filename
Вывести только последнюю строку
sed -n '$'p filename
Вывести с n-ой строки до последней
sed -n 'n,$p' filename
Вывести строки, содержащие указанный шаблон
sed -n /pattern/p filename
Вывести строки начиная с первой, где обнаружен шаблон, и до строки x
sed -n '/pattern/,xp' filename
В данном случае первое вхождение pattern содержится в строке 3, значит в терминале отобразятся строки с 3 по 5. Если нужно вывести файл до конца, используйте вместо 5 символ $
Вывести строки с x и до строки, содержащей шаблон. Если шаблон не обнаруживается, выводится файл до конца
sed -n 'x,/pattern/p' filename
Вывести все строки, содержащие шаблон, включая следующие за каждой из них x строк
sed -n '/pattern/,+xp' filename
Требуется поставить символ # перед всеми ttyv, кроме ttyv0
sed 's/^ttyv[1-8]/#&/' /etc/ttys ttyv0 "/usr/libexec/getty Pc" #ttyv1 "/usr/libexec/getty Pc" #ttyv8 "/usr/libexec/getty Pc"
Отслеживаем логи через tail -f. Для удобства отображения хотелось бы после каждой строки добавлять пустую строку.
Надо в конце строки вставлять символ перевода строки \n. Якорем(метасимволом, квантификатором), обозначающим конец строки, в большинстве диалектов регулярных выражений обычно служит символ $:
tail -f access.log | sed 's//$/\n/'