Редактор потоков - Полезные рецепты

SED - замечательная утилита, позволяющая решить проблему несколькими способами. Это путь UNIX, и SED прекрасно это доказывает. GNU / Linux предоставляет множество полезных утилит для выполнения повседневных задач. Смоделируем несколько утилит с помощью SED. Иногда может показаться, что мы решаем легкую проблему трудным путем, но цель состоит в том, чтобы продемонстрировать мощь SED.

Кошачья команда

В следующем примере каждая строка печатается как часть рабочего процесса по умолчанию.

[jerry]$ sed '' books.txt

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

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

В следующем примере команда print используется для отображения содержимого файла.

[jerry]$ sed -n 'p' books.txt

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

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

Удаление пустых строк

В следующем примере «^ $» подразумевает пустую строку, а пустые строки удаляются при успешном сопоставлении с шаблоном.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

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

Line #1 
Line #2

Точно так же в следующем примере строка печатается только в том случае, если она не пуста.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

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

Line #1 
Line #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

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

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage
Paulo Coelho

Хвост -1 Команда

«Хвост -1» печатает последнюю строку файла. Следующий синтаксис показывает его имитацию.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat test.txt

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

Line #1 
Line #2

Напишем сценарий SED.

[jerry]$ sed -n '$p' test.txt

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

Line #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 text, with CRLF line terminators

Смоделируем команду с помощью 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 text

Теперь давайте отобразим содержимое файла.

[jerry]$ cat -vte new.txt

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

Line #1$ 
Line #2$

Команда Unix2dos

Подобно dos2unix, есть команда unix2dos, которая преобразует символ новой строки UNIX в символ новой строки DOS. В следующем примере показано моделирование того же самого.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt

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

test.txt: ASCII text

Смоделируем команду с помощью SED.

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

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

new.txt: ASCII text, with CRLF line terminators

Теперь давайте отобразим содержимое файла.

Now let us display the file contents.

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

Line #1^M$ 
Line #2^M$

Cat -E команда

Команда «cat -E» показывает конец строки символом доллара ($). Следующий пример SED является имитацией того же самого.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt

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

Line #1$ 
Line #2$

Смоделируем команду с помощью SED.

[jerry]$ sed 's|$|&$|' test.txt

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

Line #1$ 
Line #2$

Cat -ET Команда

Команда «cat -ET» показывает символ доллара ($) в конце каждой строки, а символы TAB отображаются как «^ I». В следующем примере показано моделирование команды «cat -ET» с помощью SED.

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

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

Line #1^ILine #2$

Смоделируем команду с помощью SED.

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

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

Line #1^ILine #2$

команда nl

Команда «nl» просто нумерует строки файлов. Следующий сценарий SED моделирует это поведение.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

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

1 Line #1 
2 Line #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» выгружает данные в стандартный поток вывода, а также в файл. Ниже приводится симуляция команды «тройник».

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2

Смоделируем команду с помощью SED.

[jerry]$ sed -n 'p; w new.txt' test.txt

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

Line #1 
Line #2

cat -s Команда

Команда 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

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

Line #1  
Line #2
Line #3

Смоделируем команду с помощью SED.

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

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

Line #1  
Line #2  
Line #3

Команда grep

По умолчанию команда "grep" печатает строку, когда соответствие шаблону успешно. Следующий код показывает его моделирование.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt

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

Line #1

Смоделируем команду с помощью SED.

[jerry]$ sed -n '/Line #1/p' test.txt

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

Line #1

grep -v Команда

По умолчанию команда «grep -v» выводит строку, если сопоставление с образцом не удается. Следующий код показывает его моделирование.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

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

Line #2 
Line #3

Смоделируем команду с помощью SED.

[jerry]$ sed -n '/Line #1/!p' test.txt

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

Line #2 
Line #3

tr Команда

Команда «tr» переводит символы. Ниже приводится его моделирование.

[jerry]$ echo "ABC" | tr "ABC" "abc"

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

abc

Смоделируем команду с помощью SED.

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

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

abc