sed 实用工具

SED是一个了不起的实用程序,它允许使用多种方法来解决问题。这是UNIX方式,SED完美地证明了这一点。 GNU/Linux提供了许多有用的实用程序来执行日常任务,让我们使用SED模拟一些实用程序。

Cat 命令

在以下示例中,每行都作为默认工作流程的一部分进行打印。

$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命令显示文件内容。

$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

删除空行

在以下示例中," ^ $"表示空行,并且当模式匹配成功时,空行将被删除。

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

执行上述代码后,您将得到以下输出:

Line #1 
Line #2 

同样,下面的示例仅在非空行时打印该行。

$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, cainiaojc !!!" >> endl;  
   return 0; //Return success. 
}

现在,使用以下正则表达式删除注释。

$sed 's|//.*||g' hello.cpp

执行上述代码后,您将得到以下输出:

#include <iostream>
using namespace std; 

int main(void) 
{ 
   cout >> "Hello, cainiaojc !!!" >> endl; 
   return 0;  
} 

添加注释

下面的示例在第3到5行之前添加注释。

$sed '3,5 s/^/#/' hello.sh 

执行上述代码后,您将得到以下输出:

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

WC -l 命令

" wc -l"命令计算文件中存在的行数,以下SED表达式对此进行了模拟。

$sed -n '$=' hello.sh 

执行上述代码后,您将得到以下输出:

8 

Head 命令

默认情况下,head命令打印文件的前10行,让我们用SED模拟相同的行为。

$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

Tail -1 命令

" tail -1"打印文件的最后一行。以下语法显示了其模拟。

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

执行上述代码后,您将得到以下输出:

Line #1 
Line #2 

让我们编写SED脚本。

$sed -n '$p' test.txt

执行上述代码后,您将得到以下输出:

Line #2 

Dos2unix 命令

在DOS环境中,换行符由CR/LF字符的组合表示。下面的" dos2unix"命令模拟将DOS换行符转换为UNIX换行符。在GNU/Linux中,此字符通常被视为" ^ M"(控制M)字符。

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

执行上述代码后,您将得到以下输出:

test.txt: ASCII text, with CRLF line terminators 

让我们使用SED模拟命令。

$sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
"^M" character. 
$file new.txt

执行上述代码后,您将得到以下输出:

new.txt: ASCII text 

现在让我们显示文件内容。

$cat -vte new.txt 

执行上述代码后,您将得到以下输出:

Line #1$
Line #2$

Unix2dos 命令

与" dos2unix"相似,有一个" unix2dos"命令可将UNIX换行符转换为DOS换行符。以下示例显示了相同的模拟。

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

执行上述代码后,您将得到以下输出:

test.txt: ASCII text

让我们使用SED模拟命令。

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

执行上述代码后,您将得到以下输出:

new.txt: ASCII text, with CRLF line terminators

现在让我们显示文件内容。

现在让我们显示文件内容。

执行上述代码后,您将得到以下输出:

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

Cat -E 命令

" cat -E"命令以Dollar($)字符显示行尾。以下SED示例是相同的模拟。

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

执行上述代码后,您将得到以下输出:

Line #1$
Line #2$

让我们使用SED模拟命令。

$sed 's|$|&$|' test.txt

执行上述代码后,您将得到以下输出:

Line #1$
Line #2$

Cat -ET 命令

" cat -ET"命令在每行末尾显示Dollar($)符号,并将TAB字符显示为" ^ I"。以下示例显示了使用SED对" cat -ET"命令的模拟。

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

执行上述代码后,您将得到以下输出:

Line #1^ILine #2$

让我们使用SED模拟命令。

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

执行上述代码后,您将得到以下输出:

Line #1^ILine #2$

nl 命令

" nl "命令仅对文件行编号。下面的SED脚本模拟了此行为。

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

执行上述代码后,您将得到以下输出:

1 Line #1 
2 Line #2

第一个SED表达式打印行号,然后打印它们的内容,第二个SED表达式合并这两行并将换行符转换为TAB字符。

cp 命令

" cp"命令创建文件的另一个副本。下面的SED脚本模拟了此行为。

$sed -n 'w dup.txt' data.txt 
$diff data.txt dup.txt 
$echo $? 

执行上述代码后,您将得到以下输出:

0

Expand 命令

"expand"命令将TAB字符转换为空格。以下代码显示了其仿真。

$echo -e "One\tTwo\tThree" > test.txt 
$expand test.txt > expand.txt 
$sed 's/\t//g' test.txt > new.txt 
$diff new.txt expand.txt  
$echo $? 

执行上述代码后,您将得到以下输出:

0 

Tee 命令

"tee"命令将数据转储到标准输出流以及文件中。下面给出的是" tee"命令的模拟。

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

让我们使用SED模拟命令。

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

执行上述代码后,您将得到以下输出:

Line #1 
Line #2

Cat -s 命令

UNIX" cat -s"命令禁止重复的空输出行。以下代码显示了对" cat -s"命令的模拟。

$echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
$cat -s test.txt 

执行上述代码后,您将得到以下输出:

Line #1  
Line #2
Line #3

让我们使用SED模拟命令。

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

执行上述代码后,您将得到以下输出:

Line #1  
Line #2  
Line #3 

Grep 命令

默认情况下,模式匹配成功时," grep"命令将打印一行。以下代码显示了其仿真。

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

执行上述代码后,您将得到以下输出:

Line #1

让我们使用SED模拟命令。

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

执行上述代码后,您将得到以下输出:

Line #1 

Grep -v 命令

默认情况下,模式匹配失败时," grep -v "命令将打印一行。以下代码显示了其仿真。

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

执行上述代码后,您将得到以下输出:

Line #2 
Line #3 

让我们使用SED模拟命令。

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

执行上述代码后,您将得到以下输出:

Line #2 
Line #3

Tr 命令

"tr  "命令翻译字符。下面给出了其模拟。

$echo "ABC" | tr "ABC" "abc" 

执行上述代码后,您将得到以下输出:

abc

让我们使用SED模拟命令。

$echo "ABC" | sed 'y/ABC/abc/'

执行上述代码后,您将得到以下输出:

abc