SED — удивительная утилита, которая позволяет несколькими способами решить проблему. Это UNIX-способ, и SED прекрасно это доказывает. GNU / Linux предоставляет много полезных утилит для выполнения повседневных задач. Давайте смоделируем несколько утилит с помощью SED. Иногда может показаться, что мы решаем легкую проблему трудным путем, но цель состоит в том, чтобы просто продемонстрировать силу САС.
Кошачья команда
В следующем примере каждая строка печатается как часть рабочего процесса по умолчанию.
[jerry]$ sed '' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
Буря мечей, Джордж Р. Р. Мартин Две башни, Дж. Р. Р. Толкиен Алхимик Пауло Коэльо Братство Кольца, JRR Толкиен Паломничество, Пауло Коэльо Игра престолов, Джордж Р. Р. Мартин
В следующем примере команда print используется для отображения содержимого файла.
[jerry]$ sed -n 'p' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
Буря мечей, Джордж Р. Р. Мартин Две башни, Дж. Р. Р. Толкиен Алхимик Пауло Коэльо Братство Кольца, JRR Толкиен Паломничество, Пауло Коэльо Игра престолов, Джордж Р. Р. Мартин
Удаление пустых строк
В следующем примере «^ $» подразумевает пустую строку, и пустые строки удаляются при успешном совпадении с шаблоном.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1 Строка № 2
Аналогично, в следующем примере строка печатается только тогда, когда она не пуста.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1 Строка № 2
Удаление закомментированных строк из программы на C ++
Давайте создадим пример программы на C ++.
#include <iostream> using namespace std; int main(void) { // Displays message on stdout. cout >> "Hello, World !!!" >> endl; return 0; // Return success. }
Теперь удалите комментарии, используя следующее регулярное выражение.
[jerry]$ sed 's|//.*||g' hello.cpp
Выполнив приведенный выше код, вы получите следующий результат:
#include <iostream> using namespace std; int main(void) { cout >> "Hello, World !!!" >> endl; return 0; }
Добавление комментариев перед определенными строками
В следующем примере добавляются комментарии перед номерами строк с 3 по 5.
[jerry]$ sed '3,5 s/^/#/' hello.sh
Выполнив приведенный выше код, вы получите следующий результат:
#!/bin/bash #pwd #hostname #uname -a who who -r lsb_release -a
Команда wc -l
Команда «wc -l» подсчитывает количество строк, присутствующих в файле. Следующее выражение SED имитирует то же самое.
[jerry]$ sed -n '$ =' hello.sh
Выполнив приведенный выше код, вы получите следующий результат:
8
Главное командование
По умолчанию команда head печатает первые 10 строк файла. Давайте смоделируем такое же поведение с SED.
[jerry]$ sed '10 q' books.txt
Выполнив приведенный выше код, вы получите следующий результат:
Буря мечей Джордж Р. Р. Мартин Две башни JRR Толкин Алхимик Пауло Коэльо Братство кольца JRR Толкин Паломничество Пауло Коэльо
Хвост -1 Командование
«Хвост -1» печатает последнюю строку файла. Следующий синтаксис показывает его моделирование.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt [jerry]$ cat test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1 Строка № 2
Давайте напишем сценарий SED.
[jerry]$ sed -n '$p' test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка № 2
Команда Dos2unix
В среде DOS символ новой строки представлен комбинацией символов CR / LF. Следующая имитация команды «dos2unix» преобразует символ новой строки DOS в символ новой строки UNIX. В GNU / Linux этот символ часто трактуется как символ «^ M» (Control M).
[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt [jerry]$ file test.txt
Выполнив приведенный выше код, вы получите следующий результат:
test.txt: текст ASCII, с ограничителями строки CRLF
Давайте смоделируем команду, используя SED.
[jerry]$ sed 's/^M$//' test.txt > new.txt # Press "ctrl+v" followed "ctrl+m" to generate "^M" character. [jerry]$ file new.txt
Выполнив приведенный выше код, вы получите следующий результат:
new.txt: текст ASCII
Теперь давайте покажем содержимое файла.
[jerry]$ cat -vte new.txt
Выполнив приведенный выше код, вы получите следующий результат:
Линия № 1 $ Строка № 2 $
Команда Unix2dos
Подобно «dos2unix», есть команда «unix2dos», которая преобразует символ новой строки UNIX в символ новой строки DOS. Следующий пример показывает симуляцию того же самого.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt [jerry]$ file test.txt
Выполнив приведенный выше код, вы получите следующий результат:
test.txt: текст ASCII
Давайте смоделируем команду, используя SED.
[jerry]$ sed 's/$/\r/' test.txt > new.txt [jerry]$ file new.txt
Выполнив приведенный выше код, вы получите следующий результат:
new.txt: текст ASCII, с ограничителями строки CRLF
Теперь давайте покажем содержимое файла.
Теперь давайте покажем содержимое файла.
Выполнив приведенный выше код, вы получите следующий результат:
Строка № 1 ^ M $ Строка № 2 ^ M $
Команда Cat -E
Команда «cat -E» показывает конец строки символом доллара ($). Следующий пример SED — симуляция того же самого.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt [jerry]$ cat -E test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Линия № 1 $ Строка № 2 $
Давайте смоделируем команду, используя SED.
[jerry]$ sed 's|$|&$|' test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Линия № 1 $ Строка № 2 $
Cat -ET Command
Команда «cat -ET» показывает символ доллара ($) в конце каждой строки и отображает символы табуляции как «^ I». В следующем примере показано моделирование команды «cat -ET» с использованием SED.
[jerry]$ echo -e "Line #1\tLine #2" > test.txt [jerry]$ cat -ET test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка # 1 ^ ILine # 2 $
Давайте смоделируем команду, используя SED.
[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'
Выполнив приведенный выше код, вы получите следующий результат:
Строка # 1 ^ ILine # 2 $
NL Command
Команда «nl» просто нумерует строки файлов. Следующий скрипт SED имитирует это поведение.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt [jerry]$ sed = test.txt | sed 'N;s/\n/\t/'
Выполнив приведенный выше код, вы получите следующий результат:
1 строка № 1 2 строка № 2
Первое выражение SED печатает номера строк, за которыми следует их содержимое, а второе выражение SED объединяет эти две строки и преобразует символы новой строки в символы TAB.
команда cp
Команда «cp» создает другую копию файла. Следующий скрипт SED имитирует это поведение.
[jerry]$ sed -n 'w dup.txt' data.txt [jerry]$ diff data.txt dup.txt [jerry]$ echo $?
Выполнив приведенный выше код, вы получите следующий результат:
0
Развернуть команду
Команда «развернуть» преобразует символы табуляции в пробелы. Следующий код показывает его симуляцию.
[jerry]$ echo -e "One\tTwo\tThree" > test.txt [jerry]$ expand test.txt > expand.txt [jerry]$ sed 's/\t/ /g' test.txt > new.txt [jerry]$ diff new.txt expand.txt [jerry]$ echo $?
Выполнив приведенный выше код, вы получите следующий результат:
0
Tee Command
Команда «tee» сбрасывает данные в стандартный поток вывода, а также в файл. Ниже приведено моделирование команды «тройник».
[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt Line #1 Line #2
Давайте смоделируем команду, используя SED.
[jerry]$ sed -n 'p; w new.txt' test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1 Строка № 2
кошка-команда
Команда UNIX «cat -s» подавляет повторяющиеся пустые выходные строки. Следующий код демонстрирует симуляцию команды «cat -s».
[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt [jerry]$ cat -s test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1 Строка № 2 Строка № 3
Давайте смоделируем команду, используя SED.
[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1 Строка № 2 Строка № 3
команда grep
По умолчанию команда «grep» печатает строку, когда совпадение с образцом завершается успешно. Следующий код показывает его симуляцию.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt [jerry]$ grep "Line #1" test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1
Давайте смоделируем команду, используя SED.
[jerry]$ sed -n '/Line #1/p' test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка 1
Команда grep -v
По умолчанию команда «grep -v» печатает строку, когда не удается сопоставить шаблон. Следующий код показывает его симуляцию.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt [jerry]$ grep -v "Line #1" test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка № 2 Строка № 3
Давайте смоделируем команду, используя SED.
[jerry]$ sed -n '/Line #1/!p' test.txt
Выполнив приведенный выше код, вы получите следующий результат:
Строка № 2 Строка № 3
tr Command
Команда «tr» переводит символы. Ниже приведено его моделирование.
[jerry]$ echo "ABC" | tr "ABC" "abc"
Выполнив приведенный выше код, вы получите следующий результат:
азбука
Давайте смоделируем команду, используя SED.
[jerry]$ echo "ABC" | sed 'y/ABC/abc/'
Выполнив приведенный выше код, вы получите следующий результат: