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

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

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

  1. Spring认证中国教育管理中心-Spring Data MongoDB教程五

    原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...

  2. 指南-Luat二次开发教程指南-功能开发教程-功耗管理

    目录 功耗管理 简介 常用模块功耗指标 API说明 3种工作模式: 1. 全功能模式 2. 休眠模式 3. 最少功能模式 实现流程 全功能模式 休眠模式 最少功能模式 示例 全功能模式 休眠模式 最少 ...

  3. MES管理系统的“五步走”策略,改善车间的管理模式

    MES是应用在车间的软件系统,起着承上启下的作用.它上承公司级的ERP管理系统,获取计划.资源等数据,并与PLM.PDM.C3P等系统集成,获得BOM及工艺等数据.它下启底层控制系统,发送工作指令和回 ...

  4. catia设置技巧教程:进入管理模式VS工程图模板(如何进入管理模式)

    用CATIA出二维图的时候能否将自己定义的格式设置为默认的.例如标注尺寸的箭头.体,剖面标志的格式等等?解决这个问题需要在CATIA中建立满足用户需要的新标准.新标准一旦建好,用户绘制二维图时,就可以 ...

  5. python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...

  6. qemu-kvm磁盘读写的缓冲(cache)的五种模式

    qemu-kvm磁盘读写的缓冲(cache)模式一共有五种,分别是 writethrough, wirteback, none, unsafe, directsync 当你对VM读写磁盘的性能有不同的 ...

  7. MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)

    mongodb索引详解(Indexes) 索引介绍 索引在mongodb中被支持,如果没有索引,mongodb必须扫描每一个文档集合选择匹配的查询记录.这样扫描集合效率并不高,因为它需要mongod进 ...

  8. [转]OKR结合CFR的管理模式

    读前预 无论任何管理书籍,都是围绕着人性,如果激发员工的人性中的自尊和自我价值观.自我成就感. 作为一名领导者,在管理前,必须要是冷静,安静的对待他人 约翰杜尔为谷歌送上大礼 "好主意&qu ...

  9. 项目敏捷管理模式有哪几种_敏捷团队中有效沟通的5种模式

    项目敏捷管理模式有哪几种 我们的沟通方式是雇主在招聘时所寻求的最重要的技能组合. 它对成本,生产力,团队士气和员工在工作场所的保留率有重大影响. <经济学人>进行的一项研究表明,沟通中的问 ...

  10. 帝国理工创新领袖:数据驱动创新的五种模式

    ◆ ◆ ◆ 前言 当今世界,数据为创新带来新动力.数据创造了新的产品和服务.产生了新的商业模式.带来了新的创业机会.英国帝国理工大学副校长.著名创新领袖David Gann博士提出了"数据驱 ...

最新文章

  1. 万维钢_《高手——精英的见识和我们的时代》读书笔记_1
  2. 运行维护:UPS电源并列运行分析及维护应用
  3. kbmMW功能 - kbmMWProcess单元(转帖)
  4. Mockito 101
  5. MongoDB基本命令使用
  6. 你用计算机做过什么事情,他偷偷干了什么?(电脑)
  7. python中type为什么有main_python中 __name__及__main()__的妙处
  8. remote Incorrect username or password ( access token ):用户名或密码不正确(访问令牌)
  9. hdu-1068POJ1466 Girls and Boys---最大独立集
  10. linux英特尔蓝牙驱动,IntelBluetoothFirmware 英特尔蓝牙驱动
  11. 【无标题】C# 修改操作时禁用过滤器
  12. Windows系统下Android DNK r5环境配置和开发(二)
  13. shardingsphere5.0 解决第一次执行sql慢的问题
  14. 网站刷IP?活不过三秒
  15. DSConv:Efficient convolution operator
  16. 3DMAX建模教程:给模型设计逼真的发型!
  17. ARM的 N、Z、C、V 标志位的解释
  18. 【UE4 第一人称射击游戏】02-玩家健康和护甲
  19. GIt+jenkins代码自动上线
  20. kali linux 2020虚拟机镜像的安装(详细安装过程及安装包百度云连接)

热门文章

  1. App市场的“繁荣”背后 隐藏令人唏嘘的真相
  2. 深入理解分布式技术 - 两阶段的应用 MySQL XA 规范
  3. python字符串内建函数详解
  4. 计算机网掉了,非常急电脑掉网我电脑上上网就会自己掉网不显示网络断开但一切有关上 爱问知识人...
  5. 数据结构与算法笔记(九)—— 希尔排序
  6. python 奇偶链表
  7. mysql查询员工排班信息_考勤管理信息系统人员排班管理及查询
  8. Android7.0适配方案
  9. (一) 自带刷新的列表-LtRecyclerView v2.x版本(LtAdapter)(基本使用)
  10. python知识:@classmethod和@staticmethod的异同