Команда Linux sed

Linux 命令大全Полный справочник команд Linux

Команда Linux sed использует скрипты для обработки текстовых файлов.

sed может обрабатывать и редактировать текстовые файлы в соответствии с инструкциями скрипта.

Sed в основном используется для автоматического редактирования одного или нескольких файлов, упрощения повторяющихся операций с файлами, написания программ преобразования и т. д.

Синтаксис

sed [-hnV][-e<script>][-f<script文件>][文本文件]

Описание параметра:

  • -e<script> или --expression=<script> Использовать скрипт, указанный в опции, для обработки входного текстового файла.
  • -f<script file> или --file=<script file> Использовать файл скрипта, указанный в опции, для обработки входного текстового файла.
  • -h или --help Показать справку.
  • -n или --quiet или --silent Отображать только результат после обработки скриптом.
  • -V or --version Отобразить информацию о версии.

Описание действия:

  • a : Добавить. После a могут следовать строки, и эти строки появятся на новой строке (на следующей строке после текущей)~
  • c : Замена. После c могут следовать строки, и эти строки могут заменить строки между n1 и n2!
  • d : Удаление. Поскольку это удаление, после d обычно ничего не следует;
  • i : Вставка. После i могут следовать строки, и эти строки появятся на новой строке (строке перед текущей);
  • p : Печать, т. е. вывод выбранных данных. Обычно p используется вместе с параметром sed -n~
  • s : Замена. Она может напрямую выполнять замену! Обычно действие s можно использовать с регулярными выражениями! Например, 1,20s/old/new/g!

Примеры

Сначала создадим файлtestfileсо следующим содержимым:

$ cat testfile #查看testfile 中的内容  
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
Google
Taobao
Example
Tesetfile
Wiki

Вtestfileдобавьте строку после четвёртой строки файла и выведите результат в стандартный вывод. Введите следующую команду в приглашении командной строки:

sed -e 4a\newLine testfile 

Используяsed, после команды вывод будет следующим:

$ sed -e 4a\newLine testfile 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
newLine
Google
Taobao
Example
Tesetfile
Wiki

Добавление/удаление по строкам

выведетtestfileсписок содержимого и напечатает номера строк. Также, пожалуйста, удалите строки 2~5!

$ nl testfile | sed '2,5d'
     1  HELLO LINUX!  
     6  Taobao
     7  Example
     8  Tesetfile
     9  Wiki

действие sed — это2,5d, чтоdозначает удаление. Поскольку строки 2-5 удалены, в отображаемых данных больше нет строк 2-5. Кроме того, изначально следовало использовать sed -e, но можно и без -e. Также обратите внимание, что действие после sed должно быть заключено в'...'две одинарные кавычки!

Чтобы удалить только строку 2:

$ nl testfile | sed '2d' 
     1  HELLO LINUX!  
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Example
     8  Tesetfile
     9  Wiki

Чтобы удалить строки с 3 по последнюю строку:

$ nl testfile | sed '3,$d' 
     1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  

После второй строки (т. е. добавлено как третья строка), добавьтепить чай?следующий текст:

$ nl testfile | sed '2a drink tea'
     1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  
drink tea
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Example
     8  Tesetfile
     9  Wiki

Если вы хотите добавить это перед второй строкой, команда выглядит так:

$ nl testfile | sed '2i drink tea' 
     1  HELLO LINUX!  
drink tea
     2  Linux is a free unix-type opterating system.  
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Example
     8  Tesetfile
     9  Wiki

Если вы хотите добавить больше двух строк, добавьте две строки текста после второй строки, напримерВыпить чаю или .....ивыпить пива?

$ nl testfile | sed '2a Drink tea or ......\
drink beer ?'

1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  
Drink tea or ......
drink beer ?
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Example
     8  Tesetfile
     9  Wiki

Каждая строка должна использовать обратную косую черту\, чтобы обозначить новую строку. В приведенном выше примере мы видим, что в конце первой строки присутствует\.

Замена и отображение по строкам

Замените2-5 содержимое строки наНомер 2-5?

$ nl testfile | sed '2,5c No 2-5 number'
     1  HELLO LINUX!  
No 2-5 number
     6  Taobao
     7  Example
     8  Tesetfile
     9  Wiki

С помощью этого метода мы можем заменить целую строку данных.

Вывести только строки 5-7 в testfile:

$ nl testfile | sed -n '5,7p'
     5  Google
     6  Taobao
     7  Example

С помощью функции построчного отображения sed можно выбирать и отображать определенные номера строк в файле.

Поиск и отображение данных

Поиск в testfile строк с ключевым словомoo:

$ nl testfile | sed -n '/oo/p'
     5  Google
     7  Example

Если root найден, помимо вывода всех строк, совпадающая строка также будет выведена.

Поиск и удаление данных

Удалить все строки в testfile, содержащиеoo, и вывести остальные строки

$ nl testfile | sed  '/oo/d'
     1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  
     3  This is a linux testfile!  
     4  Linux test 
     6  Taobao
     8  Tesetfile
     9  Wiki

Поиск данных и выполнение команд

Поиск в testfile, найтиooсоответствующую строку, выполнить набор команд в фигурных скобках, каждая команда отделяется точкой с запятой. Здесьooзаменяется наkk, затем вывести эту строку:

$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'  
     5  Gkkgle

Последняяq— это выход.

Поиск и замена данных

Помимо режима обработки целых строк, sed также может искать и заменять части данных построчно.

Поиск и замена в sed аналогичныviкоманде, и формат синтаксиса следующий:

sed 's/要被取代的字串/新的字串/g'
Заменить первое вхождение oo в каждой строке testfile на строку kk, затем вывести содержимое файла в стандартный вывод:
sed -e 's/oo/kk/' testfile

gФлаг g обозначает глобальный поиск и замену, поэтому sed заменяет все совпадающие строки в файле. Изменённое содержимое выводится в стандартный вывод и не изменяет исходный файл:

sed -e 's/oo/kk/g' testfile

Опцияiзаставляет sed изменять файл:

sed -i 's/oo/kk/g' testfile

Пакетная обработка файлов в текущем каталоге, имена которых начинаются сtest:

sed -i 's/oo/kk/g' ./test*

Далее мы используем /sbin/ifconfig для запроса IP:

$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....

IP этой машины — 192.168.1.100.

Удалите часть перед IP:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

Далее удалите оставшуюся часть, то есть:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0。

Удалите часть после IP:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

Многоточечное редактирование

Одна команда sed для удаления данных с 3-й строки до конца testfile и замены HELLO на EXAMPLE:

$ nl testfile | sed -e '3,$d' -e 's/HELLO/EXAMPLE/'
     1  EXAMPLE LINUX!  
     2  Linux is a free unix-type opterating system.  

-e указывает на многоточечное редактирование. Первая команда редактирования удаляет данные с 3-й строки до конца testfile, а вторая команда ищет HELLO и заменяет его на EXAMPLE.

Прямое изменение содержимого файла (опасное действие)

sed может напрямую изменять содержимое файла без использования конвейерных команд или перенаправления потоков данных! Однако, поскольку это действие напрямую изменяет исходный файл, пожалуйста, не тестируйте его на системных конфигурациях! Мы всё равно будем использовать файл regular_express.txt для проверки!

Содержимое файла regular_express.txt следующее:

$ cat regular_express.txt 
example.
google.
taobao.
facebook.
zhihu-
weibo-

Используйте sed, чтобы заменить конечную . в каждой строке regular_express.txt на !

$ sed -i 's/\.$/\!/g' regular_express.txt
$ cat regular_express.txt 
example!
google!
taobao!
facebook!
zhihu-
weibo-
:q:q

Используйте sed, чтобы напрямую добавить в последнюю строку regular_express.txt:# This is a test:

$ sed -i '$a # This is a test' regular_express.txt
$ cat regular_express.txt 
example!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test

Поскольку $ обозначает последнюю строку, а действие a — это добавление, в конец файла было добавлено# This is a test!

У sed есть-iопция, которая может напрямую изменять содержимое файлов, и эта возможность очень полезна! Например, если у вас есть файл с 1 миллионом строк и вам нужно добавить немного текста в строку 100, использование vim может свести вас с ума! Потому что файл слишком большой! Что тогда делать? Просто используйте sed! С возможностью прямого изменения/замены в sed вам даже не нужно использовать vim для редактирования!

Linux 命令大全Полный справочник команд Linux

Другие расширения