Учебники

Stream Editor — Полезные рецепты

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/'

Выполнив приведенный выше код, вы получите следующий результат: