Linux sed 写命令常见使用案例

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux sed 写命令常见使用案例相关的知识,希望对你有一定的参考价值。

                           Linux sed w命令常见使用场景汇总

声明与简介

sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。本文主要以实际的数据来介绍sed的write space(写空间)即w命令的使用。

数据说明

如下是使用的示例文本数据,这里的行号是为了方便解释结果,不是文本内容。

1 7369,smith,clerk,7902,'1980-12-17',800,null,20
2 7499,allen,salesman,7698,'1981-2-20',1600,300,30
3 7521,ward,salesman,7698,'1981-2-22',1250,500,30
4 7566,jones,manager,7839,'1981-4-2',2975,null,20
5 7654,martin,salesman,7698,'1981-9-28',1250,1400,30
6 7655,jack,manager,7698,'1987-3-28',1600,1800,10
7 7656,tim,clerk,7902,'1982-12-12',1400,1400,30
8 7657,kate,clerk,7902,'1989-11-11',1400,1800,10
9 7698,blake,manager,7839,'1981-5-1',2850,null,30
10 7699,dlake,salesman,7839,'1983-6-15',3000,null,10
11 7782,clark,manager,7839,'1981-1-9',2450,null,10
12 7788,scott,analyst,7566,'1982-12-9,3000,null,20
13 7839,king,president,null,'1981-11-17',5000,null,10
14 7844,turner,salesman,7698,'1981-12-8',1500,0,30
15 7876,adams,clerk,7788,'1983-1-12',1100,null,20
16 7900,james,clerk,7698,'1981-12-3',950,null,30
17
18 --7902,ford,analyst,7566,'1981-12-3',3000,null,20
19
20 7934,miller,clerk,7782,'1982-1-23',1300,null,10

w命令

W命令即是写空间(write space)是对sed的输出流里的数据输出到指定文件的操作,该操作对原文件没有影响。

 

文本内容输出(写)

内容输入到新文件并回显控制台

# 1 将文件infilename的内容输出到outfilename里同时打印在控制台上。

sed 'w outfilename' infilename

# 示例,将emp.txt的内容写入outfile.txt并屏显
sed 'w outfile.txt' emp.txt

内容输入到新文件并屏不回显

# 2 将文件infilename的内容输出到outfilename里不打印在控制台上(静默方式)。

sed -n 'w outfilename' infilename
# 示例,将emp.txt的内容写入outfile.txt不屏显
sed -n 'w outfile.txt' emp.txt

指定具体行号输入到新文件

# 3 将文件infilename的第m行内容输出到outfilename里。
sed -n 'm w outfilename' infilename

# 将mp.txt里第17行内容输入到文件outfile.txt内
sed -n '17 w outfile.txt' emp.txt

指定行号范围输入到新文件

# 4 将文件infilename的第m到n行内容输出到outfilename里。

sed -n 'm,n w outfilename' infilename

# 将mp.txt里第14到16行内容输入到文件outfile.txt内
sed -n '14,16 w outfile.txt' emp.txt

cat outfile.txt

7844,turner,salesman,7698,'1981-12-8',1500,0,30

7876,adams,clerk,7788,'1983-1-12',1100,null,20

7900,james,clerk,7698,'1981-12-3',950,null,30

指定行号到结尾输入到新文件

# 5 将文件infilename的第m行到文件结尾内容输出到outfilename里。
sed -n 'm,$ w outfilename' infilename

# 将emp.txt第18行到文件结尾部分输出到outfile.txt
sed -n '18,$ w outfile.txt' emp.txt

#结果
--7902,ford,analyst,7566,'1981-12-3',3000,null,20



7934,miller,clerk,7782,'1982-1-23',1300,null,10

指定递增行号输入到新文件

# 6 将文件infilename的第m行以n为增幅(步长)行号的内容输出到outfilename里。
sed -n 'm~n w outfilename' infilename
# 示例,该情况会将8、13、18行的内容写入新文件outfile.txt里
sed -n '8~5 w outfile.txt' emp.txt

7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7839,king,president,null,'1981-11-17',5000,null,10
--7902,ford,analyst,7566,'1981-12-3',3000,null,20

写文件结合模式匹配

匹配关键字方式写文件

# 1 将文件infilename的以匹配word的内容输出到outfilename里。

sed -n '/word/ w outfilename' infilename

# 匹配emp.txt文件里manager关键字,写入到outfile.txt
sed -n '/manager/ w outfile.txt' emp.txt

匹配关键字结合行号写文件

# 2 对文件infilename针对匹配的行n开始关键字word,然后把内容输出到outfilename里。
sed -n '/word/,n w outfilename.txt' infilename

# 这里先做几个约定:
# 1定义3个变量:首次匹配word的行号f、最后匹配word的行号l、参数行号n。
# 2 这里遍历的关键字是”manager”即寻找所有的经理们。
# 3 由假设1和2则f是4,l是11。

# 2_1 当n小于等于f时,这里4小于等于4,仅显示匹配到manager的行。
sed -n '/manager/,4 w outfile.txt' emp.txt
#cat outfile.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7782,clark,manager,7839,'1981-1-9',2450,null,10

# 2_2 如果n>f且n<l,不难发现即有第4到7行内容和7行后仅匹配“manager“的内容汇总而来。
# 即这种情况下的文本内容由f行到n行的内容和n行后仅匹配manager的行两部分组成。
sed -n '/manager/,7 w outfile.txt' emp.txt
#cat outfile.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7698,blake,manager,7839,'1981-5-1',2850,null,30
7782,clark,manager,7839,'1981-1-9',2450,null,10

# 2_3 如果 n>=l,数据来自行4和12之间,即内容是f行到n行。
sed -n '/manager/,12 w outfile.txt' emp.txt
#cat outfile.txt
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
7788,scott,analyst,7566,'1982-12-9,3000,null,20

关键字首次出现行写文件

# 3 对文件infilename关键字word首次出现的行直至文末的内容输出到outfilename里。
sed -n '/word/,$ w outfilename' infilename

# 将emp.txt文件里首次出现的行写入到文件outfile.txt内。
sed -n '/manager/,$ w outfile.txt' emp.txt
# cat outfile.txt 
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
7788,scott,analyst,7566,'1982-12-9,3000,null,20
7839,king,president,null,'1981-11-17',5000,null,10
7844,turner,salesman,7698,'1981-12-8',1500,0,30
7876,adams,clerk,7788,'1983-1-12',1100,null,20
7900,james,clerk,7698,'1981-12-3',950,null,30

--7902,ford,analyst,7566,'1981-12-3',3000,null,20

7934,miller,clerk,7782,'1982-1-23',1300,null,10

成对关键字匹配写文件

# 4 infilename里匹配两个关键词word1、word2之间的内容,当word1、word2出现多次时,按照word1、word2对进行匹配。输出到outfilename
sed -n '/word1/,/word2/ w outfilename' infilename 

# 示例,成对匹配两个关键字并输出到文件。
sed -n '/manager/,/salesman/ w outfile.txt' emp.txt 
[root@host_128 shellscrips]# cat outfile.txt 
7566,jones,manager,7839,'1981-4-2',2975,null,20
7654,martin,salesman,7698,'1981-9-28',1250,1400,30
7655,jack,manager,7698,'1987-3-28',1600,1800,10
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7699,dlake,salesman,7839,'1983-6-15',3000,null,10
7782,clark,manager,7839,'1981-1-9',2450,null,10
7788,scott,analyst,7566,'1982-12-9,3000,null,20
7839,king,president,null,'1981-11-17',5000,null,10
7844,turner,salesman,7698,'1981-12-8',1500,0,30

关键字匹配及随后行写文件

# 5  infilename里匹配两个关键词word所在行和随后的m行内容,输出到outfilename。
sed -n '/word1/,+m w outfilename' infilename

#示例 匹配clerk关键字并将随后的2行写入文件outfile.txt内。
sed -n '/clerk/,+2 w outfile.txt' emp.txt 
[root@host_128 shellscrips]# cat outfile.txt 
7369,smith,clerk,7902,'1980-12-17',800,null,20
7499,allen,salesman,7698,'1981-2-20',1600,300,30
7521,ward,salesman,7698,'1981-2-22',1250,500,30
7656,tim,clerk,7902,'1982-12-12',1400,1400,30
7657,kate,clerk,7902,'1989-11-11',1400,1800,10
7698,blake,manager,7839,'1981-5-1',2850,null,30
7876,adams,clerk,7788,'1983-1-12',1100,null,20
7900,james,clerk,7698,'1981-12-3',950,null,30

7934,miller,clerk,7782,'1982-1-23',1300,null,10

 

以上是关于Linux sed 写命令常见使用案例的主要内容,如果未能解决你的问题,请参考以下文章

Linux sed 删除行命令常见使用详解

Linux sed 打印模式空间p命令使用案例

Liunx 中sed、grep、cut、sort、tee、diff 、paste命令

打开高效文本编辑之门_熟悉Linux Sed的替换命令

Linux之sed命令常见用法

linux的seq命令