Принцип роботи: команда sed прочитає поточний оброблений рядок і помістить його в "простір шаблону" для обробки. Після обробки буде виведений результат, а «простір шаблону» очищено. Далі прочитайте наступний рядок і помістіть його в «простір шаблону» для обробки і так далі до останнього рядка. Деякі документи також згадують термін під назвою «простір для зберігання» (також відомий як «простір для тимчасового зберігання»), який може тимчасово зберігати деякі оброблені дані та виводити їх через «простір шаблону».
"простір шаблону" та "простір утримання": область пам’яті, де обробляються та зберігаються дані.
Для отримання додаткової інформації перегляньте посібник sed.
Виводить на екран рядки тексту, які будуть оброблені лише командою sed
-e
Застосовує кілька операційних команд sed до вхідних даних текстового рядка
-f
Викликає та виконує командний файл сценарію sed
-i
Змінює вихідний файл
-r
Регулярний вираз
Операційна команда (іноді називається операційною інструкцією)
опис
s/regexp/replacement/
Рядок заміни
p
Друкує поточний "простір шаблону". Часто використовується з параметром -n, наприклад: cat -n /etc/services \\| sed -n '3,5p'
d
Видаляє «простір шаблону». Починає наступний цикл
D
Видаляє перший рядок «шаблону» та починає наступний цикл
=
Друкує номер рядка
a \text
Додає один або кілька рядків вмісту після відповідного рядка. Під час додавання кількох рядків у всіх рядках, крім останнього, потрібно використовувати "", щоб вказати, що вміст не закінчився
i \text
Додає один або кілька рядків вмісту перед відповідним рядком. Під час додавання кількох рядків у всіх рядках, крім останнього, потрібно використовувати "", щоб вказати, що вміст не закінчено
c \text
Замінює відповідні рядки новим текстом
q
Негайний вихід зі сценарію sed
r
Додає текст, прочитаний із файлу
: label
Мітка для команд b і t
b label
Гілка до етикетки; якщо мітку опущено, розгалужується до кінця сценарію
t label
Якщо "s///" є успішною заміною, відбувається перехід до мітки
h H
Копіює/додає "простір шаблону" до "простір утримання"
g G
Копіює/додає "пробіл для утримання" до "простір шаблону"
x
Обмінюється вмістом просторів утримання та шаблонів
l
Виводить поточний рядок у «візуально однозначній» формі
n N
Читає/додає наступний рядок введення в "простір шаблону"
w FILENAME
Записує поточний простір шаблону до FILENAME
!
заперечення
&
Посилання на рядок, який уже збігається
Адреси
опис
first~step
Використовуйте «first», щоб указати перший рядок, і «step», щоб вказати розмір кроку. Наприклад, виведення непарних рядків тексту за допомогою sed -n "1~2p" /etc/services
$
Відповідає останньому рядку тексту
/regexp/
Використання регулярних виразів для зіставлення рядків тексту
number
Визначає номер рядка
addr1,addr2
Використовує позиціонування номерів рядків, щоб відповідати всім рядкам від "addr1" до "addr2"
addr1,+N
Використовує позиціонування номерів рядків для відповідності addr1 і N рядків після addr1
Надрукуйте рядок, який починається з рядка NetBIOS
Shell>cat/etc/services|sed-n'/^netbios/p'
netbios-ns137/tcp# NETBIOS Name Service
netbios-ns137/udp
netbios-dgm138/tcp# NETBIOS Datagram Service
netbios-dgm138/udp
netbios-ssn139/tcp# NETBIOS session service
netbios-ssn139/udp
!!! tip "Підказка"
Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`.
Вивести текст з 23 по 26 рядки
Shell>cat-n/etc/services|sed-n'23,26p'23tcpmux1/tcp# TCP port service multiplexer24tcpmux1/udp# TCP port service multiplexer25rje5/tcp# Remote Job Entry26rje5/udp# Remote Job Entry
Друкувати непарні рядки
Shell>cat-n/etc/services|sed-n'1~2p'1# /etc/services:3#5# IANA services version: last updated 2016-07-087# Note that it is presently the policy of IANA to assign a single well-known9# even if the protocol doesn't support UDP operations.11# are included, only the more common ones.13# The latest IANA port assignments can be gotten from15# The Well Known Ports are those from 0 through 1023.17# The Dynamic and/or Private Ports are those from 49152 through 6553519# Each line describes one service, and is of the form:
...
Вивести рядок 10 до останнього рядка
Shell>cat-n/etc/services|sed-n'10,$p'10# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports11# are included, only the more common ones.12#13# The latest IANA port assignments can be gotten from14# http://www.iana.org/assignments/port-numbers15# The Well Known Ports are those from 0 through 1023.16# The Registered Ports are those from 1024 through 4915117# The Dynamic and/or Private Ports are those from 49152 through 65535
...
Рядки з 10 до останнього не друкувати
Shell>cat-n/etc/services|sed-n'10,$!p'1# /etc/services:2# $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $3#4# Network services, Internet style5# IANA services version: last updated 2016-07-086#7# Note that it is presently the policy of IANA to assign a single well-known8# port number for both TCP and UDP; hence, most entries here have two entries9# even if the protocol doesn't support UDP operations.
Надрукуйте номер рядка та вміст відповідного рядка
Використовуйте коми для розділення діапазонів рядків
Shell>cat/etc/services|sed-n'/^netbios/,/^imap/p'
netbios-ns137/tcp# NETBIOS Name Service
netbios-ns137/udp
netbios-dgm138/tcp# NETBIOS Datagram Service
netbios-dgm138/udp
netbios-ssn139/tcp# NETBIOS session service
netbios-ssn139/udp
imap143/tcpimap2# Interim Mail Access Proto v2
!!! info "примітка"
**Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється.
**Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється.
Shell>grep-n^netbios/etc/services
123:netbios-ns137/tcp# NETBIOS Name Service124:netbios-ns137/udp
125:netbios-dgm138/tcp# NETBIOS Datagram Service126:netbios-dgm138/udp
127:netbios-ssn139/tcp# NETBIOS session service128:netbios-ssn139/udp
Shell>grep-n^imap/etc/services
129:imap143/tcpimap2# Interim Mail Access Proto v2130:imap143/udpimap2
168:imap3220/tcp# Interactive Mail Access169:imap3220/udp# Protocol v3260:imaps993/tcp# IMAP over SSL261:imaps993/udp# IMAP over SSL
Іншими словами, вміст, надрукований вище, це рядки з 123 по 129
Надрукуйте рядок, де знаходиться рядок, і до останнього рядка
Shell>cat/etc/services|sed-n'/^netbios/,$p'
Використання змінних у сценаріях bash
Shell>vimtest1.sh
#!/bin/basha=10
sed-n''${a}',$!p'/etc/services
# or
sed-n"${a},\$!p"/etc/services
Це схоже на друк, за винятком того, що команду операції замінено на d, а параметр -n не потрібен.
Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки
Shell>sed-e'/udp/d'-e'/^#/d'-e'/^$/d'/etc/services
tcpmux1/tcp# TCP port service multiplexer
rje5/tcp# Remote Job Entryecho7/tcp
discard9/tcpsinknull
systat11/tcpusers
daytime13/tcp
qotd17/tcpquote
chargen19/tcpttytstsource
ftp-data20/tcp
ftp21/tcp
ssh22/tcp# The Secure Shell (SSH) Protocol
telnet23/tcp
...
Видалити послідовні рядки тексту
Shell>cat-n/etc/services|sed'10,$d'1# /etc/services:2# $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $3#4# Network services, Internet style5# IANA services version: last updated 2016-07-086#7# Note that it is presently the policy of IANA to assign a single well-known8# port number for both TCP and UDP; hence, most entries here have two entries9# even if the protocol doesn't support UDP operations.
Регулярний вираз
Shell>cat/etc/services|sed-r'/(tcp)|(udp)|(^#)|(^$)/d'
http80/sctp# HyperText Transfer Protocol
bgp179/sctp
https443/sctp# http protocol over TLS/SSL
h323hostcall1720/sctp# H.323 Call Control
nfs2049/sctpnfsdshilp# Network File System
rtmp1/ddp# Routing Table Maintenance Protocol
nbp2/ddp# Name Binding Protocolecho4/ddp# AppleTalk Echo Protocol
zip6/ddp# Zone Information Protocol
discard9/sctp# Discard
discard9/dccp# Discard SC:DISC
...
Замінити рядки (s///g)
Синтаксис
Опис синтаксису
sed 's/string/replace/g' FILENAME
s: усі рядки, що представляють вміст файлу. Ви також можете вказати діапазон рядків, наприклад: sed '20,200s/netbios/TMP/g' /etc/services g (Глобальний): якщо g немає, це означає що коли кілька відповідних рядків з’являються в одному рядку, буде замінено лише перший відповідний рядок. /: стиль розділювача. Ви також можете вказати інші стилі, наприклад: sed '20,200s?netbios?TMP?g' /etc/services
!!! tip "Підказка"
Example in the bash script:
```bash
Shell > vim /root/sedReplace.sh
#!/bin/bash
a="SELINUX=enforcing"
b="SELINUX=disabled"
sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config
# or
sed -i "s/${a}/${b}/g" /etc/selinux/config
```
Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків
Shell>grepssh/etc/services-n
44:ssh22/tcp# The Secure Shell (SSH) Protocol45:ssh22/udp# The Secure Shell (SSH) Protocol551:x11-ssh-offset6010/tcp# SSH X11 forwarding offset593:ssh22/sctp# SSH1351:sshell614/tcp# SSLshell1352:sshell614/udp# SSLshell1607:netconf-ssh830/tcp# NETCONF over SSH1608:netconf-ssh830/udp# NETCONF over SSH7178:sdo-ssh3897/tcp# Simple Distributed Objects over SSH7179:sdo-ssh3897/udp# Simple Distributed Objects over SSH7791:netconf-ch-ssh4334/tcp# NETCONF Call Home (SSH)8473:snmpssh5161/tcp# SNMP over SSH Transport Model8474:snmpssh-trap5162/tcp# SNMP Notification over SSH Transport Model9126:tl1-ssh6252/tcp# TL1 over SSH9127:tl1-ssh6252/udp# TL1 over SSH10796:ssh-mgmt17235/tcp# SSH Tectia Manager10797:ssh-mgmt17235/udp# SSH Tectia Manager
Shell>sed'/ssh/s/tcp/TCP/gp'-n/etc/services
ssh22/TCP# The Secure Shell (SSH) Protocol
x11-ssh-offset6010/TCP# SSH X11 forwarding offset
sshell614/TCP# SSLshell
netconf-ssh830/TCP# NETCONF over SSH
sdo-ssh3897/TCP# Simple Distributed Objects over SSH
netconf-ch-ssh4334/TCP# NETCONF Call Home (SSH)
snmpssh5161/TCP# SNMP over SSH Transport Model
snmpssh-trap5162/TCP# SNMP Notification over SSH Transport Model
tl1-ssh6252/TCP# TL1 over SSH
ssh-mgmt17235/TCP# SSH Tectia Manager
Shell>cat-n/root/test.txt|sed-n'{p;n}'# or
Shell>cat-n/root/test.txt|sed-n'1~2p'# or
Shell>cat-n/root/test.txt|sed'n;d'1aigairserver21221/tcp# Services for Air Server3ka-sddp31016/tcp# Kollective Agent Secure Distributed Delivery5axio-disc35100/tcp# Axiomatic discovery protocol7pmwebapi44323/tcp# Performance Co-Pilot client HTTP API9cloudcheck45514/tcp# ASSIA CloudCheck WiFi Management System
Вивести 3n рядків
Shell>cat-n/root/test.txt|sed-n'{n;n;p}'# or
Shell>cat-n/root/test.txt|sed-n'3~3p'3ka-sddp31016/tcp# Kollective Agent Secure Distributed Delivery6axio-disc35100/udp# Axiomatic discovery protocol9cloudcheck45514/tcp# ASSIA CloudCheck WiFi Management System
N
Прочитайте перший рядок і додайте один рядок після зустрічі з командою N. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду q, щоб вийти.
Shell>seq110|sed'N;q'12
Оскільки після рядка 9 немає додаткового рядка, результат буде таким:
Shell>seq19|sed-n'N;p'12345678
Коли зчитується останній рядок, команда N не виконується, і виводиться наступне:
Shell>seq19|sed-n'$!N;p'123456789
Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом.
Shell>seq16|sed'N;{s/\n//g}'123456
Ігнорувати регістр ('I')
Здається, немає інформації про ігнорування регістру в man 1 sed.
Shell>echo-e"abc\nAbc"|sed-n's/a/X/Igp'
Xbc
XBC
Shell>cat/etc/services|sed'/OEM/Ip'-n
oem-agent3872/tcp# OEM Agent
oem-agent3872/udp# OEM Agent
oemcacao-jmxmp11172/tcp# OEM cacao JMX-remoting access point
oemcacao-rmi11174/tcp# OEM cacao rmi registry access point
oemcacao-websvc11175/tcp# OEM cacao web service access point
Shell>cat/etc/services|sed-r'/(TCP)|(UDP)/Id'
Shell>cat/etc/services|sed-r'/(TCP)|(UDP)/Ic TMP'
Отримує загальну кількість рядків у файлі
Shell>cat/etc/services|sed-n'$='# or
Shell>cat/etc/services|wc-l
11473