Sed教程(五):管理模式、正则表达式、使用功能

我们已经讨论了使用模式和保持缓冲区。现在我们就来探讨更多关于它们使用的例子。

n 命令

n命令打印出模式缓冲区的内容,清除模式缓冲器,读取下一行到模式缓冲区,并在其上施加命令。下面给出的是 n命令的语法。

[address1[,address2]]n

下面是一个使用它打印指定的文件的内容n命令一个简单的例子:

[jerry]$ sed 'n' books.txt 

当执行上面的代码,它会列出下来的文件 books.text 内容:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 

让我们考虑有n个前3个 sed命令和正经过两个sed命令如下:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

这里,Sed应用于前三个命令对模式缓冲存储器,清除模式缓冲器,读取下一行到模式缓冲区,然后添加在第四和第五指令就可以了。

保持缓冲器保存的数据,但用sed命令不能在保持缓冲器直接应用。因此,我们需要使保持缓冲器数据转换成模式缓冲区。Sed提供了x 命令模式和保持缓冲区的内容。下面的命令说明x命令。

让我们稍微修 改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]$ sed -n 'x;n;p' books.txt 

在执行上面的代码,会得到如下结果:

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin 

让我们来了解此命令的工作原理。

  • 最初,Sed读取第一行,即A Storm of Swords入模式缓冲区中。

  • x 命令移动该行保持缓冲区。

  • n 读取下一行,即,George R. R. Martin到模式缓冲区。

  • 将控制传递到该命令后跟n打印出模式缓冲区的内容。

  • 这个过程一直重复,直到文件被读完。

现在让我们印刷,这将导致印刷书籍的标题前交换缓冲区的内容。

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

执行上面的代码,得到如下结果:

A Storm of Swords
The Two Towers
The Alchemist
The Fellowship of the Ring
The Pilgrimage
A Game of Thrones

h 命令

h命令处理保持缓冲区。从模式缓冲区,以保持它的缓冲区拷贝数据。从保持现有的缓存数据被覆盖。需要注意的是-h命令不动的数据,它只是复制数据。因此,复制的数据保持,因为它是在模式缓冲区。下面给出的是-h命令的语法。

[address1[,address2]]h 

下面的命令打印标题-作家Paulo Coelho。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt 

执行上面的代码,得到如下结果:

The Alchemist 
The Pilgrimage

H 命令

h命令破坏了保持缓冲器以前的内容。这并不总是可以接受的,因为有时我们需要保留的内容。为了这个目的,sed提供了通过添加一个新行,在所述端部追加的内容,以保持缓冲器为H命令。 h和H的命令之间的唯一差别是,保持缓冲器前者重写数据,而后来的数据追加到保持缓冲器。它的语法类似于这是如下的h命令:

[address1[,address2]]H

让我们再举一个例子。而不是仅打印书名这一次,打印其作者的名字了。下面的例子打印书名后面的作者姓名。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt 

执行上面的代码,得到如下结果:

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

g 命令

我们学会了如何复制/追加模式缓冲区中的内容保存缓冲区。我们可以执行相反的功能呢?肯定是的!为了这个目的,Sed提供 g 命令其副本从保持缓冲器到模式缓冲区中的数据。而复制,从模式空间现有的数据被覆盖。下面给出了g命令的语法。

[address1[,address2]]g

让我们考虑相同的例子- 在打印的书名和作者。这一次,我们将首先打印的作者和下一行,相应的题书的名字。下面的命令打印的作者Paulo Coelho,其次是它的书名的名字。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt 

执行上面的代码,会得到如下结果:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

G 命令

同样,我们可以追加保持缓冲器中的内容到模式缓冲区。Sed提供G指令它通过添加一个新行,在末尾追加内容到图案缓冲区。它的语法是类似于g命令是如下:

[address1[,address2]]G

现在,就让我们来它打印的作者Paulo Coelho随后其书名名称前面的例子。为了达到同样的效果,请执行以下sed命令。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

执行上面的代码,会得到如下结果:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

可以修改上面的例子中,只需更换G指令之前,缓冲区的内容如下显示书名后面他们的作者:

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

执行上面的代码,会得到如下结果:

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho 



sed是强大,高效的处理正则表达式。一些复杂的任务,可以解决简单的正则表达式。任何命令行专家都知道正则表达式的威力。

本教程介绍了标准的正则表达式,POSIX类的正则表达式和元字符。考虑我们有一个文本文件 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

标准的正则表达式

行开始 (^)

插入符号(^)符号用于一行的开始匹配。下面的例子打印所有的启动与模式“the”行。

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

执行上面的代码,会得到如下结果:

The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho

行尾 ($)

行尾是由美元符号($)符号表示。下面的例子打印“Coelho”结尾的行。

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

执行上面的代码,会得到如下结果:

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

单个字符(.)

点(.)匹配除行字符结尾的任何单个字符。下面的例子打印所有三个字母的单词字符 “t” 结尾。

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p' 

执行上面的代码,会得到如下结果:

cat 
bat 
rat 
mat

匹配字符集合 ([])

字符集是用方括号([])表示。它用来匹配只有1个之中的几个字符。下面的例子匹配模式“Call”和“Tall”,而不是“Ball”。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

执行上面的代码,会得到如下结果:

Call 
Tall

独有集 ([^])

当使用的字符集使用时,插入符否定集在方括号字符。只有下面的示例打印“Ball”。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

执行上面的代码,会得到如下结果:

Ball 

字符范围 ([-])

当被提供的字符范围,则正则表达式匹配在方括号中指定的范围内的任何字符。下面的例子匹配“Call”和“Tall”,而不是“Ball”。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p' 

执行上面的代码,会得到如下结果:

Call 
Tall

现在,让我们修改范围为“A-P”,并观察结果。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p' 

执行上面的代码,会得到如下结果:

Call 
Ball

零到一次出现 (\?)

问号(\?)匹配零个或一个匹配前面的字符。下面的例子匹配“Behaviour”和“Behavior”。在这里,我们通过使用“\?”使“u”作为一个可选的字符。

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p' 

执行上面的代码,会得到如下结果:

Behaviour 
Behavior

一次或多次出现 (\+)

加号(\+)匹配前面的字符出现一次或多次。下面的例子匹配“2”出现一次或多次。

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

执行上面的代码,会得到如下结果:

22 
123 
234 
222 

零或多次出现 (*)

星号(*)匹配零个或多个发生了前面的字符。下面的例子匹配"ca", "cat", "catt"等依此类推。

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p' 

执行上面的代码,会得到如下结果:

ca 
cat 

n个重复 {n}

{n}表达完全一致的“n”出现前面的字符。下面的例子打印只有三个数字。但在这之前,你需要创建以下文件,该文件仅包含数字。考虑 numbers.txt 有以下内容:

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

现在让我们编写 Sed 表达式。在这里,对花括号中的“\”字符转义。

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt 

执行上面的代码,会得到如下结果:

100

最少出现n个 {n,}

{n,} 表达式匹配,至少是“n”出现前面的字符。下面的例子打印大于或等于5个数字的所有数字。

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

执行上面的代码,会得到如下结果:

10000 
100000 
1000000
10000000 
100000000 
1000000000 

M到N次出现 {m, n}

{m, n} 表达式匹配,至少是“M”和最“N”出现前面的字符。下面的例子打印所有具有至少5个数字,但不超过8位的数字。

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

执行上面的代码,会得到如下结果:

10000 
100000 
1000000 
10000000 

管道(|)

管道符的行为类似于逻辑或运算。它从管的两侧相匹配的条目。下面的例子要么匹配"str1" 和 "str3"。这里,一对括号和管道 (|) 由“\”字符转义。

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p' 

执行上面的代码,会得到如下结果:

str1 
str3

字符转义

有哪些有在Sed有特殊含义的特殊字符。例如,用“\n”表示换行,回车被为“\r”表示,依此类推。要使用这些字符转换成普通的ASCII,我们必须使用反斜杠(\)字符转义。本章说明了转义特殊字符。

转义 "\"

下面的例子匹配的模式“\”。

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

执行上面的代码,会得到如下结果:

str1\str2 

转义 "\n"

下面的示例将新行字符匹配。

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

执行上面的代码,会得到如下结果:

str1\nstr2

转义 "\r"

下面的例子回车匹配。

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

执行上面的代码,会得到如下结果:

str1\rstr2 

转义"\dnnn"

这个匹配一个字符的十进制ASCII码值是“nnn”。下面的例子中只匹配字符“a”。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

执行上面的代码,会得到如下结果:

a

转义 "\onnn"

这个匹配字符的八进制ASCII码值是“nnn”。下面的例子仅匹配字符“b”。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p' 

执行上面的代码,会得到如下结果:

b 

这个匹配字符的十六进制ASCII码值是“nnn”。下面的例子中只匹配字符“c”。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

执行上面的代码,会得到如下结果:

c

正则表达式POSIX类

有哪些有Sed 特殊的含义一定的保留字。这些保留字被称为POSIX类正则表达式。本节介绍Sed支持POSIX类。

[:alnum:]

这意味着按字母和数字字符。下面的例子只匹配“One”和“123”,但不匹配制表符。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

执行上面的代码,会得到如下结果:

One 
123

[:alpha:]

这意味着只有字母字符。下面的例子只匹配单词“One”。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

执行上面的代码,会得到如下结果:

One 

[:blank:]

这意味着空白字符可以是任何空格或制表符。下面的例子只匹配制表符。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

执行上面的代码,会得到如下结果:

^I$

注意,该命令“cat -vte”用于显示制表符(^ I)中。

[:digit:]

这意味着只有小数。下面的例子只匹配数字“123”。

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p' 

执行上面的代码,会得到如下结果:

123 

[:lower:]

这意味着只有小写字母。下面的例子只匹配“one”。

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p' 

执行上面的代码,会得到如下结果:

one 

[:upper:]

这意味着只有大写字母。下面的例子只匹配 "TWO".

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

执行上面的代码,会得到如下结果:

TWO

[:punct:]

它意味着标点符号包括非空格或字母数字字符

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

执行上面的代码,会得到如下结果:

One,Two

[:space:]

这意味着空格字符。下面的例子说明了这一点。

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte 

执行上面的代码,会得到如下结果:

123^L^I$ 

元字符

像传统的正则表达式,Sed也支持特殊字符。这些是Perl风格正则表达式。需要注意的是元字符的支持是GNU Sed,可能无法与Sed的其他变种的工作。让我们详细讨论的元字符。

单词边界 (\b)

“\b”元字符的字边界匹配。例如,“\bthe\b”匹配“the”而不是"these", "there", "they", "then", 依此类推。下面的例子说明了这一点。

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

执行上面的代码,会得到如下结果:

the

非单词边界(\B)

“\B”元字符匹配非单词边界。例如,“the\B”匹配“,这些”these“和“they”而不是“the”。下面的例子说明了这一点。

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

执行上面的代码,会得到如下结果:

these 
they

单空白 (\s)

“\s”元字符意味着单个空格字符。下面的例子匹配“Line\t1”,但不匹配“Line1”。

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

执行上面的代码,会得到如下结果:

Line 1 

单非空白 (\S)

“\S”元字符意味着单个空格字符。下面的例子匹配“Line2”,但不匹配“Line\t1”。

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p' 

执行上面的代码,会得到如下结果:

Line2

单字字符 (\w)

“\W”元字符意味着单个单词字符,即字母字符,数字和下划线(_)。下面的例子说明了这一点。

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

执行上面的代码,会得到如下结果:

One 
123 
1_2

单非单词字符 (\W)

“\W”元字符意味着一个非单词字符,以“\w”正好相反。下面的例子说明了这一点。

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

On executing the above code, you get the following result:

&;#

模式空间的开始 (\`)

“\”'元字符意味着将模式空间的开始位置。下面的例子只匹配单词“One”。

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p' 

执行上面的代码,会得到如下结果:

One


SED是一个了不起的工具,它允许多种方式来解决问题。 GNU/ Linux提供了许多有用的实用程序来执行日常的日常任务。让我们模拟使用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

Cat 命令

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

[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 

下面的示例使用打印命令来显示文件内容。

[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 命令

Unix的"wc -l" 命令的计数存在于文件中的行数。下面的sed表达式模拟相同。

[jerry]$ sed -n '$ =' hello.sh 

执行上面的代码,会得到如下结果:

8 

head 命令

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

[jerry]$ sed '3 q' books.txt 

执行上面的代码,会得到如下结果:

A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho

tail -1 命令

Unix的“tail -1”打印文件的最后一行。下面的语法显示了模拟。

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

执行上面的代码,会得到如下结果:

A Game of Thrones, George R. R. Martin

dos2unix 命令

在DOS环境下,换行符是由CR/LF字符的组合表示。 “DOS2UNIX”命令下面的模拟将一个DOS换行符UNIX换行符。在GNU/Linux中,这个角色往往被视为“^M”(控制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模拟命令。

# Press "ctrl+v" followed "ctrl+m" to generate 
[jerry]$ sed 's/^M$//' test.txt > new.txt
"^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”。下面的例子显示使用Sed的“cat -ET”命令模拟。

[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

expand 命令

“expand”命令TAB字符转换为空格。下面的代码显示了模拟。

[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 命令

“tee”命令可以将数据输出到标准输出流和文件。下面给出的是“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 命令

UNIXcat -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



from: http://www.yiibai.com/sed/sed_useful_recipes.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值