Команда Linux sed
Полный справочник команд 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 для редактирования!
Другие расширения