sed命令n,N,d,D,p,P,h,H,g,G,x解析

news/2024/11/30 1:40:44/

1、

sed执行模板=sed '模式{命令1;命令2}'

即逐行读入模式空间,执行命令,最后输出打印出来

2、

为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\n的内容,并追加到默认输出之前。

sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行

2-1、n命令

n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后的任何命令,并对新读取的内容,重头执行sed。

例子:

从aaa文件中取出偶数行

1
2
3
4
5
6
7
8
9
10
cat  aaa 
This is 1    
This is 2    
This is 3    
This is 4    
This is 5    
     
sed  -n  'n;p'  aaa          //-n 表示隐藏默认输出内容    
This is 2    
This is 4


注 释:读取This is 1,执行n命令,此时模式空间为This is 2,执行p,打印模式空间内容This is 2,之后读取 This is 3,执行n命令,此时模式空间为This is 4,执行p,打印模式空间内容This is 4,之后读取This is 5,执行n 命令,因为没有了,所以退出,并放弃p命令。

因此,最终打印出来的就是偶数行。

 

2-2、N命令

N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。

例子:

从aaa文件中读取奇数行

1
2
3
4
5
6
7
8
9
10
11
cat  aaa   
This is 1   
This is 2   
This is 3   
This is 4   
This is 5   
                                                     
sed  -n  '$!N;P'  aaa            
This is 1   
This is 3   
This is 5

注释中1代表This is 1   2代表This is 2  以此类推

注释:读取1,$!条件满足(不是尾行),执行N命令,得出1\n2,执行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出3\n4,执行P,打印得3,读取5,$!条件不满足,跳过N,执行P,打印得5

 

2-3、d命令

d命令是删除当前模式空间内容(不在传至标准输出),并放弃之后的命令,并对新读取的内容,重头执行sed。

d命令例子

从aaa文件中取出奇数行

1
2
3
4
5
6
7
8
9
10
11
cat  aaa   
This is 1   
This is 2   
This is 3   
This is 4   
This is 5   
                                                           
sed  'n;d'  aaa           
This is 1   
This is 3   
This is 5

注释:读取1,执行n,得出2,执行d,删除2,得空,以此类推,读取3,执行n,得出4,执行d,删除4,得空,但是读取5时,因为n无法执行,所以d不执行。因无-n参数,故输出1\n3\n5

2-4、D命令

D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。

D命令例子

从aaa文件中读取最后一行

1
2
3
4
5
6
7
8
9
cat  aaa   
This is 1   
This is 2   
This is 3   
This is 4   
This is 5   
                                                
sed  'N;D'  aaa           
This is 5

注释:读取1,执行N,得出1\n2,执行D,得出2,执行N,得出2\n3,执行D,得出3,依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5

 

2-5、y命令

y命令的作用在于字符转换

y命令例子:

将aaa文件内容大写

1
2
3
4
5
6
sed  'y/his/HIS/'  aaa  
THIS IS 1  
THIS IS 2  
THIS IS 3  
THIS IS 4  
THIS IS 5

此外,如果需要对某个字符串进行大小写转换,则可使用如下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
cat  ddd   
This is a and a is 1   
This is b and b is 2   
This is c and c is 3   
This is d and d is 4   
This is e and e is 5   
    
sed  's/\b[a-z]\b/\u&/g'  ddd   
This is A and A is 1   
This is B and B is 2   
This is C and C is 3   
This is D and D is 4   
This is E and E is 5

2-6、h命令,H命令,g命令,G命令

h命令是将当前模式空间中内容覆盖至保持空间,H命令是将当前模式空间中的内容追加至保持空间

g命令是将当前保持空间中内容覆盖至模式空间,G命令是将当前保持空间中的内容追加至模式空间

命令例子:

将ddd文件中数字和字母互换,并将字母大写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat  ddd. sed
h  
{  
s/.*is \(.*\) and .*/\1/  
y /abcde/ABCDE/
G  
s/\(.*\)\n\(.*is \).*\(and \).*\(is \)\(.*\)/\2\5 \3\5 \4\1/  
}  
                                           
sed  -f ddd. sed  ddd  
This is 1 and 1 is A  
This is 2 and 2 is B  
This is 3 and 3 is C  
This is 4 and 4 is D  
This is 5 and 5 is E

注释:读取1,执行h,复制到保持空间,执行s,模式空间得到匹配到的字母a,然后执行y,将a转成A,执行G,追加保持空间内容到模式空间,得

A\nThis is a and a is 1;执行s,重新排列,得出This is 1 and 1 is A;以此类推,得出结果。

这里需要注意的是匹配的内容中,空格一定要处理好,空格处理不对,会造成第二次s匹配错误,无法执行重新排列或排列错误

2-7、x命令

x命令是将当前保持空间和模式空间内容互换


http://www.ppmy.cn/news/749276.html

相关文章

c语言库函数总结----stdlib.h库

思维导图大纲 前言 stdlib .h 头文件定义了四个变量类型、一些宏和各种通用工具函数。 double atof(const char *str) 函数原型 double atof(const char *str) 函数功能: 把参数 str 所指向的字符串转换为一个浮点数(类型为 double 型)。 …

string.h 详解

string.h 简介 C语言标准库中一个常用的头文件,在使用到字符数组时需要使用。 函数简介 函数功能简介memchr在内存块中定位字符的位置memcmp把两个内存块的内容进行比较。memcpy复制内存块的内容memmove移动内存块中的内容memset以字节方式填充内存块strcat把一…

C语言字符串string.h详解

本文已整合到C语言标准库深度解读 文章目录 查询函数比较函数复制和追加本地函数 为了看上去规整简洁,令 #define cSTR const char *str #define vSTR const void *str由于字符串自身存在终止符\0,所以下面所有提及对字符串前n个字符的操作&#xff0c…

cdn刷新api_xổ số miền nam thứ 7 hàng tuần

đồng thời đẩy mạnh truyền thng trn knh fanpage发展目REIT2014年,新一代的全基因组数据研究证实,现代波利尼西亚人的基因与欧洲、美洲以及澳大利亚等民族的混合程度,都远远低于中国台湾的原住民。 hiệu quả cng tc kiểm tra1.4385淘气bao gồm cả hai quần đ…

c语言的.h文件怎么写,c语言自己写一个.h的头文件

首先放上三段简单的源码 main.c 里面的内容 #include"stdio.h" #include "lib.h" int main(){ int a,b,c; printf("请输入a:"); scanf("%d",&a); printf("\n请输入b:"); scanf("%d",&a…

编程实现计算n!,键盘输入n

#include<stdio.h> int main() { int n; printf("请输入n:"); scanf("%d",&n); int i1,mul1; do { mulmul*i; i; }while(i<n); printf("%d\n",mul); return 0; }

C语言求N阶乘的方法

1.用for循环&#xff1a; #include<stdio.h> main&#xff08;&#xff09; { int n,i,x&#xff1b; printf ("in put a num : "); scanf ("%d",&n); if (n<0) printf ("data error! \n"); if(n0) printf ("0!" ,1); el…

C语言windows.h库的常用函数(三)

SetCursorPos函数 用途 SetCursorPos函数是windows.h库中用来设置指针位置的函数&#xff0c;使用该函数鼠标指针将会直接跳至指定坐标位置 参数 SetCursorPos函数拥有x和y两个整型参数&#xff0c;作为鼠标指针的坐标位置&#xff08;其中0,0坐标对应屏幕左上角&#xff0…