Sed

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的命令。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值