首页 > 编程学习 > (二)Linux三剑客-sed

(二)Linux三剑客-sed

发布时间:2022/11/10 2:41:22

一、描述

Sed(流编辑器)是非交互式命令行文本编辑器。Sed通常用于过滤文本,也就是说,它接受文本输入,对其执行一些操作(或一组操作),并输出修改后的文本。Sed通常用于使用模式匹配来提取文件的一部分或替换文件中多次出现的字符串。

(1)sed 命令语法

sed OPTIONS... [SCRIPT] [INPUTFILE...]

例如,替换res1文件中的所有 hello 为 word 并把结果输入到 output.txt

# 每次读取res1.txt文件里面的一行,把hello替换为world
# 每读取一行放在模式空间,
sed 's/hello/world/' res1.txt 


# 替换res1文件中的所有 hello 为 word 并把结果输入到 output.txt
sed 's/hello/world/' res1.txt > output.txt

(2)-i 

也可以加上 -i  参数,可以理解为重写,

当我们执行的时候不会输出任何内容,但是当我们重新看这个txt文件的时候发现里面的hello已经被修改为world。

像这个命令大家肯定之前都接触过,比如说是换国内源啥的,都是用sed -i这个命令。

(3)-n

-n,实际上就是禁止它的默认的一个打印,因为sed会默认输出每一行

res1.txt文件中有7行数据,我只想打印第四4行咋办?详情移步看下面第四个参数。

(4)-p

4p:第四行

Xp:第X行

 因为sed是默认输出所有行,所以我在不加-n的前提下,他会打印所有行,然后指定某行的时候,那行会再次被打印一遍。

(5)$p

默认情况下sed将多个输入文件视为一个长流。下面的示例打印文件中的第一行和最后一行。

sed -n '1p;$p' res1.txt 


 那么我想打印第一个文件中的第一行和第二个文件中的最后一行怎么办呢?

sed -n '1p;$p' res1.txt test.txt 

(6)-s

separate,分开

那么问题又来了,我希望打印每个文件的第一行和最后一行,而非第一个文件的第一行和第二个文件的最后一行,该怎么做呢?

sed -ns '1p;$p' res1.txt test.txt

(7)-e 或者 -f

二、命令行参数

(1)--version

打印当前版本

sed --version

(2)--help

打印帮助文档

sed --help

(3)-n 

-n也好,--help也好,--silent也好,这三个参数都是禁止自动打印,只在通过p命令显式地告知时才产生输出。

三、sed命令

sed命令由一个或多个sed命令组成,由一个或多个-e、-f、--expression和--file选项传入,如果没有使用这些选项,则传入第一个非选项参数。

sed命令遵循以下语法:

[addr]x[options]

 下面的示例删除输入中的第30行到第35行。 30,35 is an address range.   d 为delete命令

sed '30,35d' input.txt > output.txt

我们再举个栗子🌰~

删除文件夹里的2~5行。

sed '2,5d' res.txt


 我们再来个栗子🌰~

在一个文件中查找1开头的,如果找到这样的行,sed将以退出状态1终止。如果没有找到这样的行(也没有发生其他错误),sed将退出,状态为0。

命令还有很多,这边就不一一讲解啦,大家想看可以去bd搜索官方文档。

四、多命令语法

 有几种方法可以在sed程序中指定多个命令。从文件运行sed脚本(使用-f选项)时,使用换行符是最自然的。在命令行中,sed命令也可以用换行符分隔。或者,你可以将每个命令指定为-e选项的参数:

seq也是一个命令,其实是输出序列。


我们举个栗子🌰~

 输出6的序列,同时删除第一行第三行第五行~(四种写法在下面大家自己看一哈)

 五、地址-选择行

 (1)通过数字选择行

  

 举个栗子🌰~

每隔两行打印。

sed -n '0~2p' res.txt

(2)通过文本匹配选择行

 (3)范围地址

  

六、替换命令s

 

(1)特殊序列

# 把替换部分转换成小写,直到遇到 \U 或 \E
\L

# 把下一个字母替换成小写
\l

# 把替换部分转换为大写,直到遇到 \L 或 \E
\U

# 把下一个字母替换为大写
\u

# 停止由 \U, \L 开始的大小写转换。
\E

举个栗子🌰~

(2)正则标志

1. g        将替换应用于regexp的所有匹配项,而不仅仅是第一个。

默认只会替换一个

 

 那么我希望他全部替换怎么办呢? g

那么我希望他只替换指定序号咋办(比如说只想替换第三个)? 加个序号数字

2.  w filename 如果进行了替换,则将结果写入指定文件

3. i I 使sed以不区分大小写的方式匹配regexp

4. m M sed在多行模式下匹配正则表达式。

(3)注意点

 

七、sed常用命令

(1)q

退出sed命令,例如打印第二行后停止

seq 3 | sed 2q

(2)d

删除命令,例如删除第二个输入行 

seq 3 | sed 2d

(3)p

打印模式空间(到标准输出)。这个命令通常只与-n命令行选项一起使用。

例如:只输出第二个输入行。 

seq 3 | sed -n 2p

 

(4)n

如果没有禁用自动打印,则打印模式空间,然后,不管怎样,用输入的下一行替换模式空间。如果没有更多的输入,sed将退出,而不处理任何更多的命令。

这个命令对于跳过行很有用(例如处理第n行)。

 

 

 

八、命令行参数

(1)-e script 指定脚本

(2)-i

 

 (3)-E  

-E

-r 

九、脚本实例

(1)合并行

合并指定的行,例如第2行和第3行需要合并。

有一个test.txt文件,内容里面展示如下:

N:添加一个换行符,然后将下面一行的内容也跟在本行后面。

sed '2{N;s/\n//;}' lines.txt

 

 

(2)合并反斜杠

上方是文件内容

下方是命令

:x        打了一个标签

b         分行无条件给标签,只要碰到x标签跳到前面:x,再次循环执行 /\\&/ {...}

 

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式