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

Материал из megapuper
Перейти к: навигация, поиск
Строка 25: Строка 25:
  
 
Замена шаблона в конкретной строке. В данном случае заменяет заданное слово только в третьей строке
 
Замена шаблона в конкретной строке. В данном случае заменяет заданное слово только в третьей строке
  sed '3 s/<font color=blue>unix</font>/<font color=red>linux</font>/' filename
+
  sed '3 s/<font color=blue>текст1</font>/<font color=red>текст2</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 's/<font color=blue>unix</font>/<font color=red>linux</font>/p' geekfile.txt
 
  
  

Версия 23:08, 31 мая 2022

Удалить строчку по шаблону

sed '/шаблон/d' filename


Заменить в строке ТЕКСТ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'
(W)elcome (T)o (T)he (M)oscow


Замена шаблона в конкретной строке. В данном случае заменяет заданное слово только в третьей строке

sed '3 s/текст1/текст2/' 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



В файле есть строчки:
ttyv0 "/usr/libexec/getty Pc"
ttyv1 "/usr/libexec/getty Pc"
...
ttyv8 "/usr/libexec/getty Pc"

Требуется поставить символ # перед всеми ttyv, кроме ttyv0:

sed 's/^ttyv[1-8]/#&/' /etc/ttys


Отслеживаем логи через tail -f. Для удобства отображения хотелось бы после каждой строки добавлять пустую строку. Надо в конце строки вставлять символ перевода строки \n. Якорем(метасимволом, квантификатором), обозначающим конец строки, в большинстве диалектов регулярных выражений обычно служит символ $:

tail -f access.log | sed 's/$/\n/'


Вывести определённую строку, в данном случае третью:

sed -n 3p