打开高效文本编辑之门_Linux sed之多行命令与循环命令

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打开高效文本编辑之门_Linux sed之多行命令与循环命令相关的知识,希望对你有一定的参考价值。

Linux sed之多行命令与循环命令使用案例

声明与简介

sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。

sed模式匹配是对文件的一行内容进行处理,除非我们用到H、G、N命令这种方式才会追加个\\n即产生个新行。

数据说明

1 emp_2line.txt,该数据奇数行是员工名、偶数行是员工职位。比如第3行Jim是员工的名字、第4行manager是他的职位。

Tom
ceo
Jim
manager
Jack
salesman
Kate
manager
Luke
developer
Nancy
tester
Lily
hr
John
tester

2 emp_3_line.txt该数据奇数行是员工名、员工职位、员工职位简介以#号包裹。第一行的tom是CEO,它的职位简介是#chief executive officer#。

Tom
ceo #chief executive officer  #
Jim
manager #IT 
manager#
Jack
salesman #Responsible 
for goods sales#
Kate
manager #operations manager#
Luke
developer #web developer#
Nancy
tester #Test Engineer#
Lily
hr #Human Resources#
John
tester #Quality 
Assurance#

多行命令

Sed里如何产生多行。

N命令

这里的N命令和模式空间与保持空间章节里的n类似但又有不同,它不会打印和清空当前模式空间里的内容,而是在当前模式空间里加个回车”\\n”,从原文件里读取一行追加到模式空间里。重复循环执行模式空间匹配的流程。

注:这个效果类似于一下子读取两行到模式空间里。

模式空间接成多行

# 打印出所以的员工和职位,并以“,“分割。
sed -e '{N;s/\\n/,/'} emp_2line.txt
# 结果
Tom,ceo
Jim,manager
Jack,salesman
Kate,manager
Luke,developer
Nancy,tester
Lily,hr
John,tester
注: 1 如果想匹配职位是“manager“的,可以通过管道”|“再结合sed匹配来实现。
# 仅显示员工职位是manager的员工名称和职位(N命令方式)。
sed -e '{N;s/\\n/,/'} emp_2line.txt | sed -n '/manager/p'
# 结果
Jim,manager
Kate,manager

P命令

P命令类似小写的p命令(模式空间打印),它和p类似只不过,它在碰到换行符”\\n”时才打印,打印换行符前的内容。

模式空间打印多行的第一行

# N命令结合P实现员工职位是manager的员工名
sed -n -e 'N' -e '/manager/P' emp_2line.txt 

# 结果
Jim
Kate

#注:这里加了P名,即碰到”\\n”时才打印,打印其前面的内容(也就是打印多行内容的第一行)。

D命令

大写的D命令在遇到第一个换行标识(“\\n”)时才停止删除(含\\n),终止执行余下的sed命令,从头再执行(新的循环)。

If pattern space contains newlines, delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.

If pattern space contains no newline, start a normal new cycle as if the d command was issued.

# 官网参考链接

https://www.gnu.org/software/sed/manual/html_node/sed-commands-list.html

P命令结合D命令示例

#显示匹配manager的员工名和职位名,完成该功能有多个方法。这里主要解释P、D命令结合起来使用的原理或者过程。
sed -n -e 'N' -e '/manager/P;D' emp_2line.txt
# 结果
Jim
manager
Kate
manager
# 执行过程详解
# Step1:假如sed遍历到“Jim”所在的行,那么因为有N命令,所以此时模式空间里的内容为 Jim\\nmanager
# Step2; P命令打印多行的第一行的内容,此时为Jim
# Step3: D命令的作用是删除模式空间里截止到首个\\n的内容(含\\n)即有manager
# 因为P和D都会追加个换行,所以最后的输出是:
Jim
manager
同理分析其它数据。

删除多行特殊符号匹配

# 删除文件内的岗位描述后输出员工信息(员工名、员工职位)。
# Way1
sed -e '/#/{N;/#.*#/{s/#.*#// }}' emp_3line.txt
# Way2 使用第一种方式即可,当前方法主要是演示P和D怎样结合起来使用。
sed -e '/#/{N;/#.*#/{s/#.*#//;P;D}}' emp_3line.txt
# 结果
Tom
ceo 
Jim
manager 
Jack
salesman 
Kate
manager 
Luke
developer 
Nancy
tester 
Lily
hr 
John
tester
# 过程详解
# Step1  /#/{ 最外层的循环是以”#”来匹配所有要处理的内容。
# Step2 N是从输入文件里获得下一行并追加到模式空间。
# Step3  /#.*#/ 这个是通过首和尾都是“#”的来匹配内容。如果匹配到就进入下一个步骤。
# Step4 s/#.*#//;P;D 这一步的替换是将包含和尾都是“#”的内容都替换为空字符串,P是打印\\n前的内容,D是删除\\n后的内容。
注:a 以实际例子来说明。比如此时针对已经读到第2行
1 Tom
2 ceo #chief executive officer  #
3 Jim
1:由Step1、Step2知道满足匹配 #,这时需要将“\\n”和下一行的内容追加到模式空间,因为有N。这里模式空间里的内容为: ceo#chief executive officer  #\\nJim
2 :又因为满足Step3,所以进入内部的step4,此时因为有替换所以内容为 ceo\\nJim。又有P即打印出ceo\\nceo\\nJim\\n;因为p和P类似会在追加个换行符号。
此时的D又做了删除对应第一个ceo\\n,所以最终为ceo\\nJim\\n。
3 :然后从第4行 manager #IT 继续重复执行。
b) 以第4行为例: 
4 manager #IT 
5 manager#
1: 假如读取到第4行,因为Step1、Step2,这时需要追加第5行到模式空间即manager #IT\\n manager#
2: 又因为满足Step3,此时又进入step4,因为替换,所以当前内容为\\n,因为P是打印换行前的内容所以为manager\\nmanager\\n。D又做了删除(删除第一个manager\\n),所以最终是manager\\n。

标签命令

如果想在sed的执行流程加入控制,则可以通过b即标签,类似goto跳转的功能。

跳转命令

# 对员工名和职位用@来分割;岗位是manager的在其最前头加上” ~”。该脚本命名为goto.sed。
# 脚本详情
#!/bin/sed -nf
h;n;H;x
s/\\n/\\t/
/manager/!b lab_mg
s/^/~/
:lab_mg
P
# 赋予可执行权限。
chomod +x goto.sed
# 执行
./goto.sed emp_2line.txt
# 结果
Tom	ceo
~Jim	manager
Jack	salesman
~Kate	manager
Luke	developer
Nancy	tester
Lily	hr
John	tester
#过程详解:
# Step1:每一行遍历时通过n命令将下一行放入保持空间,通过H将模式空间的内容追加到方式保持空间里,以Tom所在行为例,此时保持空间的内容为Tom\\nceo
Step2:x交换,则此时模式空间里为Tom\\nceo
Step3:结合s替换,则\\n替换为了\\t即制表符。
针对lab_mg的则是匹配到manager关键字即在模式空间里最前方以~输出。

循环命令

重复执行

# 新增label.sed文件并输入如下内容:
#!/bin/sed -nf
h;n;H;x
s/\\n/\\t/
:lab_t
/manager/s/^/~/
/~~~/!t lab_t
P
#赋执行权限
chomod +x label.sed
#执行
./label.sed emp_2line.txt
#结果
Tom	ceo
~~~Jim	manager
Jack	salesman
~~~Kate	manager
Luke	developer
Nancy	tester
Lily	hr
John	tester
#过程详解
# Step1:每一行遍历时通过n命令将下一行放入保持空间,通过H将模式空间的内容追加到方式保持空间里,以Tom所在行为例,此时保持空间的内容为Tom\\nceo
Step2:x交换,则此时模式空间里为Tom\\nceo
Step3:结合s替换,则\\n替换为了\\t即制表符。
这里主要将下“重复”环节:
Step 4:如果模式空间里匹配到manager则将行头替换 “~”,相当于添加。
Step 5:如果该行不包含三个“~”,即“~~~”就跳转到行首添加“~”的过程,即Step4。直到该行有了三个~”。这种往复的过程叫做repeat(循环执行)。

 

以上是关于打开高效文本编辑之门_Linux sed之多行命令与循环命令的主要内容,如果未能解决你的问题,请参考以下文章

打开高效文本编辑之门_Linux Sed模拟常见文件命令

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

打开高效文本编辑之门_Linux Sed插入追加转换退出等命令应用

打开高效文本编辑之门_Linux sed之模式空间与保留空间

打开高效文本编辑之门_Linux awk之关联数组

打开高效文本编辑之门_Linux Awk之条件判断与循环