Sed 是我们经常用到的一个命令,全称是Streaming EDitor。sed命令是一个编辑器,将文件编辑为一个流。将文件作为流就是使用管道(>或|)从另一个命令传递它,或者直接将它加载到sed中。
这个命令的工作原理和其他编辑器一样,除了不现实文件和允许可视化编程。命令是被传递给sed来操纵流。
sed的五个基本功能如下:
1)Search
2)Replace
3)Delete
4)Adding
5)Change/Transform
在了解命令参数之前我们先来看一下基本语法。
1、语法
sed命令的基本格式如下:
sed [options] commands [file-to-edit]
options将在这篇博客中陆续提及。commands是搜索和替换的模式,可以是正则表达式。
接下来将介绍sed的基本原理和基本命令。
1、示例文件
打开终端,创建一个接下来用于sed的示例,输入以下命令:
cd
grep --help >grephelp.txt
我们将在主文件下看到文件grephelp.txt,文件的内容是grep命令的帮助指导。
2、搜索
搜索特定字符是一个编辑器的常见功能,所以sed也不例外。sed可以搜索文件中的字符串,让我们看看是怎么操作的。
如果我们想在示例文件中搜索字符串'PATTERN' ,则运行以下命令:
sed -n 's/PATTERN/PATTERN/p' grephelp.txt
结果显示如下:
用法: grep [选项]... PATTERN [FILE]...
在每个 FILE 或是标准输入中查找 PATTERN。
默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。
-E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
-F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串。
-G, --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE)
-P, --perl-regexp PATTERN 是一个 Perl 正则表达式
-e, --regexp=PATTERN 用 PATTERN 来进行匹配操作
-f, --file=FILE 从 FILE 中取得 PATTERN
-w, --word-regexp 强制 PATTERN 仅完全匹配字词
-x, --line-regexp 强制 PATTERN 仅完全匹配一行
-o, --only-matching show only the part of a line matching PATTERN
--include=FILE_PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=FILE_PATTERN 跳过匹配FILE_PATTERN 的文件和目录
--exclude-dir=PATTERN 跳过所有匹配PATTERN 的目录。
我们来一步步地看这条命令,首先是参数’-n‘,用来抑制不满足匹配模式的打印,也就是说只会打印符合匹配模式的内容。如果没有这个参数,所有流入sed的行都将被打印。
文件名’grephelp.txt‘即我们在第一步中创建的示例文件。
's/PATTERN/PATTERN/p'由四部分组成,第一部分’s‘表示执行替换。
第二部分和第三部分表示执行的模式,第一个是搜索的模式,第二个是替换流中匹配字符串的模式。在本例中我们找到字符串”PATTERN“并且用”PATTERN“替换掉它。
最后一个命令是’p‘,’p‘命令指定在替换完成后打印新的行。因为我们调用了参数’-n‘,抑制了其他行的打印,所以只有替换的新行会被打印出来。
3、替换
有时候,我们希望对搜索的字符串进行替换,则可以执行以下命令:
sed -n 's/PATTERN/Pattern/p' grephelp.txt
这个命令和我们搜索的命令很像,搜索的时候替换的文本也为搜索的文本,所以就结果来看只是完成了搜索的功能,如果想要对搜索的字符串进行替换,则直接修改命令中替换部分的模式,这条命令的功能为将文件中字符串”PATTERN“全部替换为”Pattern“,运行结果如下:
用法: grep [选项]... Pattern [FILE]...
在每个 FILE 或是标准输入中查找 Pattern。
默认的 Pattern 是一个基本正则表达式(缩写为 BRE)。
-E, --extended-regexp Pattern 是一个可扩展的正则表达式(缩写为 ERE)
-F, --fixed-strings Pattern 是一组由断行符分隔的定长字符串。
-G, --basic-regexp Pattern 是一个基本正则表达式(缩写为 BRE)
-P, --perl-regexp Pattern 是一个 Perl 正则表达式
-e, --regexp=Pattern 用 PATTERN 来进行匹配操作
-f, --file=FILE 从 FILE 中取得 Pattern
-w, --word-regexp 强制 Pattern 仅完全匹配字词
-x, --line-regexp 强制 Pattern 仅完全匹配一行
-o, --only-matching show only the part of a line matching Pattern
--include=FILE_Pattern 只查找匹配FILE_PATTERN 的文件
--exclude=FILE_Pattern 跳过匹配FILE_PATTERN 的文件和目录
--exclude-dir=Pattern 跳过所有匹配PATTERN 的目录。
如果我们使用cat命令查看文件,
cat grephelp.txt
我们会发现文件的内容没有改变,这是因为在流中进行数据的查找和替换不会改变文件,改变只是在输出的流中。我们可以使用管道将输出传输到另一个文件中,命令如下:
sed 's/PATTERN/Pattern/' grephelp.txt > grephelp1.txt
我们会看到标准目录下出现了一个新文件grephelp1.txt,文件内容为更改过后的内容。
如果使用以下命令:
sed 's/PATTERN/Pattern/p' grephelp.txt > grephelp1.txt
则更改过的内容会出项两次,因为这里没有抑制打印,所以数据流中的内容会全部通过管道传输到文件中,又因为’p‘命令,替换过后的新行又会被传输到文件中,所以文件中替换的行会出现两次。
我们可以用符号”&“来替换相同的字符串,例如:
s/PATTERN/&/p
表示用相同的字符串来替换PATTERN,即实现搜索功能。我们还可以在字符串上添加一些东西,如:
‘s/PATTERN/&S/p
表示用PATTERNS替换掉PATTERN。
如果想要替换每行中特定的 模式该怎么办?sed可以实现在每一行中指定我们需要替换的内容。举例来说,如果一行中有至少两个破折号,我们想把第二个破折号替换为星号(*),则可以执行以下命令:
sed 's/-/*/2' grephelp.txt
’2‘表示我们替换的目标为搜索模式的第二次出现,通俗一点将就是当第二次搜索到’-‘时,将之替换。如果缺省’2‘,那么将替换破折号的第一次出现。
如果想要将每一行的破折号全部替换,则可以执行以下命令:
sed 's/-/*/g' grephelp.txt
也可以将命令组合起来使用,如果我们想替换2到末尾所有的破折号,则可以执行以下命令:
sed 's/-/*/2g' grephelp.txt
现在从第二个破折号以后,全部破折号都被替换为星号(*)了。
4、删除
有时我们想删除搜索到的字符串,例如我们想删除文件中所有的破折号,则可以执行以下命令:
sed ‘s/-//g’ grephelp.txt
替换的字符串部分为空白。
5、添加
当找到匹配项时我们可以添加一行指定的文本来突出显示或者打印。
如果想要在匹配项后面加入一段文本,我们可以使用命令’a‘,并且在后面跟加入的文本。例如我们想在’--‘后面添加一段文本”double dash before this line“,我们可以执行以下命令:
sed '/--/ a "double dash before this line"' grephelp.txt
如果想要将文本添加到匹配项之前,执行命令如下:
sed '/--/ i "double dash after this line"' grephelp.txt
6、更改/转换
如果一行需要更改或者转化,我们可以使用命令”c“。
假设我们有一个私密文件,该文件带有指定字符串的行需要被改变,所以命令”c“是改变匹配项的整行而不在仅仅是匹配项。
例如,在我们的示例文件中,我们将所有包含PATTERN的行替换为”This line is Top Secret“,命令如下:
sed ‘/PATTERN/ c This line is Top Secret’ grephelp.txt
我们还可以执行行转换命令来改变字母的大小写,命令为”y“。例如我们想将所有的小写字母”a“转换为大写字母”A“,则命令如下:
sed ‘y/a/A/’ grephelp.txt
也可以对多个字母进行操作,如:
sed ‘y/abdg/ABDG/’ grephelp.txt
7、就地更改
如果想要对一个正在使用的文件进行更改,则可以使用选项”-i“
例如我们想将PATTERN更改为Pattern并且对文件进行更改,则可以使用以下命令:
sed -i 's/PATTERN/Pattern/' grephelp.txt
这个时候在查看文件,会发现文件已经被更改了。以上的几条命令都可以使用”-i“选项来对原始文件内容产生更改。
以上就是我们常用的sed的命令。