Перейти до змісту

Команда sed

sed: Stream Editor

Принцип роботи: команда sed прочитає поточний оброблений рядок і помістить його в "простір шаблону" для обробки. Після обробки буде виведений результат, а «простір шаблону» очищено. Далі прочитайте наступний рядок і помістіть його в «простір шаблону» для обробки і так далі до останнього рядка. Деякі документи також згадують термін під назвою «простір для зберігання» (також відомий як «простір для тимчасового зберігання»), який може тимчасово зберігати деякі оброблені дані та виводити їх через «простір шаблону».

"простір шаблону" та "простір утримання": область пам’яті, де обробляються та зберігаються дані.

Для отримання додаткової інформації перегляньте посібник sed.

Використання команди:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
опції опис
-n Виводить на екран рядки тексту, які будуть оброблені лише командою 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

Приклади використання

  1. Зіставлення та друк (p)

  2. Надрукуйте рядок, який починається з рядка NetBIOS

    Shell > cat /etc/services | sed -n '/^netbios/p'
    netbios-ns      137/tcp                         # NETBIOS Name Service
    netbios-ns      137/udp
    netbios-dgm     138/tcp                         # NETBIOS Datagram Service
    netbios-dgm     138/udp
    netbios-ssn     139/tcp                         # NETBIOS session service
    netbios-ssn     139/udp
    

!!! tip "Підказка"

 Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`.
  • Вивести текст з 23 по 26 рядки

    Shell > cat -n /etc/services | sed -n '23,26p'
    23  tcpmux          1/tcp                           # TCP port service multiplexer
    24  tcpmux          1/udp                           # TCP port service multiplexer
    25  rje             5/tcp                           # Remote Job Entry
    26  rje             5/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-08
    7  # Note that it is presently the policy of IANA to assign a single well-known
    9  # 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 from
    15  # The Well Known Ports are those from 0 through 1023.
    17  # The Dynamic and/or Private Ports are those from 49152 through 65535
    19  # 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 ports
    11  # are included, only the more common ones.
    12  #
    13  # The latest IANA port assignments can be gotten from
    14  #       http://www.iana.org/assignments/port-numbers
    15  # The Well Known Ports are those from 0 through 1023.
    16  # The Registered Ports are those from 1024 through 49151
    17  # 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 style
    5  # IANA services version: last updated 2016-07-08
    6  #
    7  # Note that it is presently the policy of IANA to assign a single well-known
    8  # port number for both TCP and UDP; hence, most entries here have two entries
    9  # even if the protocol doesn't support UDP operations.
    
  • Надрукуйте номер рядка та вміст відповідного рядка

    Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services
    123
    netbios-ns      137/tcp                         # NETBIOS Name Service
    124
    netbios-ns      137/udp
    125
    netbios-dgm     138/tcp                         # NETBIOS Datagram Service
    126
    netbios-dgm     138/udp
    127
    netbios-ssn     139/tcp                         # NETBIOS session service
    128
    netbios-ssn     139/udp
    
  • Зіставте діапазон рядків і надрукуйте його

    Використовуйте коми для розділення діапазонів рядків

    Shell > cat  /etc/services | sed -n '/^netbios/,/^imap/p'
    netbios-ns      137/tcp                         # NETBIOS Name Service
    netbios-ns      137/udp
    netbios-dgm     138/tcp                         # NETBIOS Datagram Service
    netbios-dgm     138/udp
    netbios-ssn     139/tcp                         # NETBIOS session service
    netbios-ssn     139/udp
    imap            143/tcp         imap2           # Interim Mail Access Proto v2
    

!!! info "примітка"

 **Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється.
  **Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється.
Shell > grep -n ^netbios /etc/services
123:netbios-ns      137/tcp                         # NETBIOS Name Service
124:netbios-ns      137/udp
125:netbios-dgm     138/tcp                         # NETBIOS Datagram Service
126:netbios-dgm     138/udp
127:netbios-ssn     139/tcp                         # NETBIOS session service
128:netbios-ssn     139/udp

Shell > grep -n ^imap /etc/services
129:imap            143/tcp         imap2           # Interim Mail Access Proto v2
130:imap            143/udp         imap2
168:imap3           220/tcp                         # Interactive Mail Access
169:imap3           220/udp                         # Protocol v3
260:imaps           993/tcp                         # IMAP over SSL
261:imaps           993/udp                         # IMAP over SSL

Іншими словами, вміст, надрукований вище, це рядки з 123 по 129

  • Надрукуйте рядок, де знаходиться рядок, і до останнього рядка

    Shell > cat /etc/services | sed -n '/^netbios/,$p'
    
  • Використання змінних у сценаріях bash

    Shell > vim test1.sh
    #!/bin/bash
    a=10
    
    sed -n ''${a}',$!p' /etc/services
    # or
    sed -n "${a},\$!p" /etc/services
    
  • Регулярний вираз

    Відповідає лише "Три цифри" + "/udp".

    Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p'
    sunrpc          111/udp         portmapper rpcbind      # RPC 4.0 portmapper UDP
    auth            113/udp         authentication tap ident
    sftp            115/udp
    uucp-path       117/udp
    nntp            119/udp         readnews untp   # USENET News Transfer Protocol
    ntp             123/udp                         # Network Time Protocol
    netbios-ns      137/udp
    netbios-dgm     138/udp
    netbios-ssn     139/udp
    ...
    
  • Зіставити та видалити (d)

Це схоже на друк, за винятком того, що команду операції замінено на d, а параметр -n не потрібен.

  • Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки

    Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services
    tcpmux          1/tcp                           # TCP port service multiplexer
    rje             5/tcp                           # Remote Job Entry
    echo            7/tcp
    discard         9/tcp           sink null
    systat          11/tcp          users
    daytime         13/tcp
    qotd            17/tcp          quote
    chargen         19/tcp          ttytst source
    ftp-data        20/tcp
    ftp             21/tcp
    ssh             22/tcp                          # The Secure Shell (SSH) Protocol
    telnet          23/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 style
    5  # IANA services version: last updated 2016-07-08
    6  #
    7  # Note that it is presently the policy of IANA to assign a single well-known
    8  # port number for both TCP and UDP; hence, most entries here have two entries
    9  # even if the protocol doesn't support UDP operations.
    
  • Регулярний вираз

    Shell > cat  /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d'
    http            80/sctp                         # HyperText Transfer Protocol
    bgp             179/sctp
    https           443/sctp                        # http protocol over TLS/SSL
    h323hostcall    1720/sctp                       # H.323 Call Control
    nfs             2049/sctp       nfsd shilp      # Network File System
    rtmp            1/ddp                           # Routing Table Maintenance Protocol
    nbp             2/ddp                           # Name Binding Protocol
    echo            4/ddp                           # AppleTalk Echo Protocol
    zip             6/ddp                           # Zone Information Protocol
    discard         9/sctp                  # Discard
    discard         9/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 > sed -n '44,45s/ssh/SSH/gp' /etc/services
    SSH             22/tcp
    SSH             22/udp
    
  • Використовуйте символ "&", щоб посилатися на рядок

    Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services
    ssh-SSH             22/tcp
    ssh-SSH             22/udp
    
  • Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків

    Shell > grep ssh /etc/services -n
    44:ssh             22/tcp                          # The Secure Shell (SSH) Protocol
    45:ssh             22/udp                          # The Secure Shell (SSH) Protocol
    551:x11-ssh-offset  6010/tcp                        # SSH X11 forwarding offset
    593:ssh             22/sctp                 # SSH
    1351:sshell          614/tcp                 # SSLshell
    1352:sshell          614/udp                 #       SSLshell
    1607:netconf-ssh     830/tcp                 # NETCONF over SSH
    1608:netconf-ssh     830/udp                 # NETCONF over SSH
    7178:sdo-ssh         3897/tcp                # Simple Distributed Objects over SSH
    7179:sdo-ssh         3897/udp                # Simple Distributed Objects over SSH
    7791:netconf-ch-ssh  4334/tcp                # NETCONF Call Home (SSH)
    8473:snmpssh         5161/tcp                # SNMP over SSH Transport Model
    8474:snmpssh-trap    5162/tcp                # SNMP Notification over SSH Transport Model
    9126:tl1-ssh         6252/tcp                # TL1 over SSH
    9127:tl1-ssh         6252/udp                # TL1 over SSH
    10796:ssh-mgmt        17235/tcp               # SSH Tectia Manager
    10797:ssh-mgmt        17235/udp               # SSH Tectia Manager
    
    Shell > sed '/ssh/s/tcp/TCP/gp' -n  /etc/services
    ssh             22/TCP                          # The Secure Shell (SSH) Protocol
    x11-ssh-offset  6010/TCP                        # SSH X11 forwarding offset
    sshell          614/TCP                 # SSLshell
    netconf-ssh     830/TCP                 # NETCONF over SSH
    sdo-ssh         3897/TCP                # Simple Distributed Objects over SSH
    netconf-ch-ssh  4334/TCP                # NETCONF Call Home (SSH)
    snmpssh         5161/TCP                # SNMP over SSH Transport Model
    snmpssh-trap    5162/TCP                # SNMP Notification over SSH Transport Model
    tl1-ssh         6252/TCP                # TL1 over SSH
    ssh-mgmt        17235/TCP               # SSH Tectia Manager
    
  • Заміна рядка для послідовних рядків

    Shell > sed '10,30s/tcp/TCP/g' /etc/services
    
  • Кілька збігів і замін

    Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g'
    
  • Групова заміна регулярних виразів

    У регулярних виразах "()" є групуванням. \1 представляє референтну групу 1, \2 представляє референтну групу 2 і так далі.

    Shell > cat /etc/services
    ...
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
    Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g'
    ...
    axio-disc       35100/tcp       CONTENT1               # Axiomatic discovery protocol
    axio-disc       35100/udp       ADD2               # Axiomatic discovery protocol
    pmwebapi        44323/tcp       CONTENT1               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp       ADD2               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp       CONTENT1               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp       CONTENT1               # Capture handwritten signatures
    

    \t: тобто вкладка

  • Замініть усі рядки коментарів порожніми

    Shell > cat /etc/services | sed -r 's/(^#.*)//g'
    ...
    chargen         19/udp          ttytst source
    ftp-data        20/tcp
    ftp-data        20/udp
    
    ftp             21/tcp
    ftp             21/udp          fsp fspd
    ssh             22/tcp                          # The Secure Shell (SSH) Protocol
    ssh             22/udp                          # The Secure Shell (SSH) Protocol
    ...
    
  • Замініть одну з малих літер слова великою

    Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g'
    hello,World
    POSIX
    
  • Зміна позиції рядка

    Shell > cat /etc/services
    ...
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    

    Ми можемо розділити цей файл на п'ять частин:

    cloudcheck-ping    45514       /     udp        # ASSIA CloudCheck WiFi Management keepalive
     ↓                   ↓         ↓      ↓               ↓
    (.*)           (\<[0-9]+\>)   \/   (tcp|udp)         (.*)
     ↓                   ↓                ↓               ↓ 
     \1                 \2               \3              \4
    
    Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g'
    ...
    edi_service     udp/34567               # dhanalakshmi.org EDI Service
    axio-disc       tcp/35100               # Axiomatic discovery protocol
    axio-disc       udp/35100               # Axiomatic discovery protocol
    pmwebapi        tcp/44323               # Performance Co-Pilot client HTTP API
    cloudcheck-ping udp/45514               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      tcp/45514               # ASSIA CloudCheck WiFi Management System
    spremotetablet  tcp/46998               # Capture handwritten signatures
    
  • Видаліть усі пробіли

    Shell > echo -e "abcd\t1 2 3 4\tWorld"
    abcd    1 2 3 4 World
    Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g'
    abcd1234World
    
  • Виконайте кілька разів за допомогою параметра -e

Наступний приклад:

Shell > tail -n 10 /etc/services
aigairserver    21221/tcp               # Services for Air Server
ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
edi_service     34567/udp               # dhanalakshmi.org EDI Service
axio-disc       35100/tcp               # Axiomatic discovery protocol
axio-disc       35100/udp               # Axiomatic discovery protocol
pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
spremotetablet  46998/tcp               # Capture handwritten signatures

Shell > tail -n 10 /etc/services | sed  -e '1,3d' -e '/cloud/s/ping/PING/g'
# or
Shell > tail -n 10 /etc/services | sed  '1,3d ; /cloud/s/ping/PING/g'      
edi_service     34567/udp               # dhanalakshmi.org EDI Service
axio-disc       35100/tcp               # Axiomatic discovery protocol
axio-disc       35100/udp               # Axiomatic discovery protocol
pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
cloudcheck-PING 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
spremotetablet  46998/tcp               # Capture handwritten signatures
  1. Додайте вміст над або під певним рядком («i» і «a»)

  2. Додайте два рядки вмісту над вказаним номером рядка

    Shell > tail -n 10 /etc/services > /root/test.txt
    Shell > cat /root/test.txt
    aigairserver    21221/tcp               # Services for Air Server
    ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    edi_service     34567/udp               # dhanalakshmi.org EDI Service
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
    Shell > cat /root/test.txt | sed '3i 123\
    abc'
    aigairserver    21221/tcp               # Services for Air Server
    ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    123
    abc
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    edi_service     34567/udp               # dhanalakshmi.org EDI Service
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
  3. Додайте три рядки під вказаним номером рядка

Shell > cat /root/test.txt | sed '5a 123\
comment yes\
tcp or udp'
aigairserver    21221/tcp               # Services for Air Server
ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
edi_service     34567/udp               # dhanalakshmi.org EDI Service
axio-disc       35100/tcp               # Axiomatic discovery protocol
123
comment yes
tcp or udp
axio-disc       35100/udp               # Axiomatic discovery protocol
pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
spremotetablet  46998/tcp               # Capture handwritten signatures
  • Зіставте певний рядок на основі рядка та додайте 2 рядки вмісту над ним

    Shell > cat /root/test.txt | sed '/tcp/iTCP\
    UDP'
    TCP
    UDP
    aigairserver    21221/tcp               # Services for Air Server
    ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    TCP
    UDP
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    edi_service     34567/udp               # dhanalakshmi.org EDI Service
    TCP
    UDP
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    TCP
    UDP
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    TCP
    UDP
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    TCP
    UDP
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
  • Замінити рядки (c)

  • Знайдіть один або кілька рядків на основі рядка та замініть ці рядки тексту

    Shell > cat /root/test.txt | sed '/ser/c\TMP1 \
    TMP2'
    TMP1
    TMP2
    ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    TMP1
    TMP2
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
  • Заміна однієї лінії

    Shell > cat /root/test.txt | sed '7c REPLACE'
    aigairserver    21221/tcp               # Services for Air Server
    ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    edi_service     34567/udp               # dhanalakshmi.org EDI Service
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    REPLACE
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
  • Замінити послідовні рядки тексту

    Shell > cat /root/test.txt | sed '2,$c REPLACE1 \
    replace2'
    aigairserver    21221/tcp               # Services for Air Server
    REPLACE1
    replace2
    
  • Замініть парні рядки

    Shell > cat /root/test.txt | sed '2~2c replace'
    aigairserver    21221/tcp               # Services for Air Server
    replace
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    replace
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    replace
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    replace
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    replace
    
  • Прочитайте вміст файлу та додайте його вміст під відповідним рядком (r)

Shell > cat /root/app.txt
append1
POSIX
UNIX

Shell > cat /root/test.txt | sed '/ping/r /root/app.txt'
aigairserver    21221/tcp               # Services for Air Server
ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
edi_service     34567/udp               # dhanalakshmi.org EDI Service
axio-disc       35100/tcp               # Axiomatic discovery protocol
axio-disc       35100/udp               # Axiomatic discovery protocol
pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
append1
POSIX
UNIX
cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
spremotetablet  46998/tcp               # Capture handwritten signatures
  1. Записати відповідні рядки в інші файли (w)
Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt'

Shell > cat /root/storage.txt
axio-disc       35100/tcp               # Axiomatic discovery protocol
axio-disc       35100/udp               # Axiomatic discovery protocol
  1. Читання/додавання наступного рядка введення в "простір шаблону" (n і N)

  2. Надрукуйте наступний рядок відповідного рядка

    Shell > cat /root/test.txt
    aigairserver    21221/tcp               # Services for Air Server
    ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    edi_service     34567/udp               # dhanalakshmi.org EDI Service
    axio-disc       35100/tcp               # Axiomatic discovery protocol
    axio-disc       35100/udp               # Axiomatic discovery protocol
    pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    spremotetablet  46998/tcp               # Capture handwritten signatures
    
    Shell > cat /root/test.txt | sed '/ping/{n;p}' -n
    cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    

!!! tip "Підказка"

 Кілька команд операції `sed` можуть впливати одна на одну, і ви можете використовувати "**{ }**", щоб зменшити цей вплив.
  • Друк рівних рядків тексту

    Спочатку прочитайте перший рядок, оскільки присутня команда n; буде роздруковано другий рядок і так далі.

    Shell > cat -n /root/test.txt | sed -n '{n;p}'
    # or
    Shell > cat -n /root/test.txt | sed -n '2~2p'
    2  ka-kdp          31016/udp               # Kollective Agent Kollective Delivery
    4  edi_service     34567/udp               # dhanalakshmi.org EDI Service
    6  axio-disc       35100/udp               # Axiomatic discovery protocol
    8  cloudcheck-ping 45514/udp               # ASSIA CloudCheck WiFi Management keepalive
    10  spremotetablet  46998/tcp               # Capture handwritten signatures
    
  • Друк непарних рядків тексту

    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'
    1  aigairserver    21221/tcp               # Services for Air Server
    3  ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    5  axio-disc       35100/tcp               # Axiomatic discovery protocol
    7  pmwebapi        44323/tcp               # Performance Co-Pilot client HTTP API
    9  cloudcheck      45514/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'
    3  ka-sddp         31016/tcp               # Kollective Agent Secure Distributed Delivery
    6  axio-disc       35100/udp               # Axiomatic discovery protocol
    9  cloudcheck      45514/tcp               # ASSIA CloudCheck WiFi Management System
    
  • N

    Прочитайте перший рядок і додайте один рядок після зустрічі з командою N. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду q, щоб вийти.

    Shell > seq 1 10 | sed 'N;q'
    1
    2
    

    Оскільки після рядка 9 немає додаткового рядка, результат буде таким:

    Shell > seq 1 9 | sed -n 'N;p'
    1
    2
    3
    4
    5
    6
    7
    8
    

    Коли зчитується останній рядок, команда N не виконується, і виводиться наступне:

    Shell > seq 1 9 | sed -n '$!N;p'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом.

    Shell > seq 1 6 | sed 'N;{s/\n//g}'
    12
    34
    56
    
  • Ігнорувати регістр ('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-agent       3872/tcp                # OEM Agent
    oem-agent       3872/udp                # OEM Agent
    oemcacao-jmxmp  11172/tcp               # OEM cacao JMX-remoting access point
    oemcacao-rmi    11174/tcp               # OEM cacao rmi registry access point
    oemcacao-websvc 11175/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
    

Author: tianci li