SED — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
 
(не показаны 33 промежуточные версии этого же участника)
Строка 1: Строка 1:
Удалить строчку по шаблону
+
'''Замена'''
sed '/<font color=blue>шаблон</font>/d' filename
 
  
 
+
Заменить в строке ТЕКСТ1 на ТЕКСТ2. По умолчанию команда sed заменяет первое вхождение шаблона в каждой строке, не затрагивая второе, третье и т.д.(если в строке будет несколько текст1, то заменится только первый)
Заменить в строке ТЕКСТ1 на ТЕКСТ2
 
 
  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
  sed 's/pattern/replacement/g' filename
+
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/g' filename
 +
 
 +
Замена всех вхождений шаблона в строке начиная с n-ого. Для этого номер вхождения, с которого нужно начать, сопровождается флагом g. Следующая команда заменит в каждой строке третье, четвёртое и т.д. вхождение
 +
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>/g'
 +
(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 '<font color=blue>s/ */ /g</font>' filename
 +
 
 +
Дублирование изменяемых строк. При добавлении флага /p команда выведет в терминал строки, где производится замена. Строки, в которых искомый шаблон отсутствует, не дублируются
 +
sed 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/p' filename
 +
 
 +
Вывод только строк с заменой. Если рядом с флагом /p добавить ключ -n, в терминале отобразятся только строки, где выполнялась замена. В данном случае -n отключает дублирующее поведение флага /p, поэтому строки с заменой выводятся по одному разу
 +
sed -n 's/<font color=blue>текст1</font>/<font color=red>текст2</font>/p' filename
 +
 
 +
Замена шаблона в указанном диапазоне строк. Можно указывать диапазон строк, в которых требуется заменить определённый шаблон. Здесь производится замена в строках с 1 по 3
 +
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
  
  
В файле есть строчки:<br/>
+
'''Удаление строк из файла'''
ttyv0 "/usr/libexec/getty Pc"<br/>
 
ttyv1 "/usr/libexec/getty Pc"<br/>
 
...<br/>
 
ttyv8 "/usr/libexec/getty Pc"<br/>
 
  
Требуется поставить символ # перед всеми ttyv, кроме ttyv0:
+
Удаление n-ой строки
  sed 's/^ttyv[1-8]/#&/' /etc/ttys
+
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
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
Требуется поставить символ # перед всеми ttyv, кроме ttyv0
 +
  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>'
 
 
 
 
Вывести определённую строку, в данном случае третью:
 
sed -n 3p
 

Текущая версия на 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/'