linux 隔行添加字符,shell在每一行插入字符,sed用法

1. 如何在一个文本文件中的每一行头插入一个字符2. 如何在一个文本文件中的每一行尾插入一个字符

3. 如何在一个文本文件中的每一行的指定列插入一串字符

1.awk '{print "X"$0}' urfile

2.awk '{print $0"X"}' urfile3.awk '$O=$O" X"' urfile

一、sed是什么?

sed全名叫stream editor,流编辑器(也叫行编辑器),其处理文本的方式为一行一行的,不同于vi等全屏编辑器;主要用途为通过匹配一个或多个正则表达式来对文本进行处理,实现过滤和转换文本。

sed 的工作方式

sed 实用工具按顺序逐行将文件读入到内存中。然后,它执行为该行指定的所有操作,并在完成请求的修改之后将该行放回到内存中,以将其转储至终端。完成了这一行 上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。如同前面所提到的,默认输出是将每一行的内容输出到屏幕上(特别要注意这点,因此一般要配合-n参数不让其显示不需要的)。在这里,开始涉及到 两个重要的因素—首先,输出可以被重定向到另一文件中,以保存变化;第二,源文件(默认地)保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。不过,可以按需要将操作限制在指定的行上。

二、基本用法:

通过man命令查看sed帮助如下:NAME

sed – stream editor for filtering and transforming text

SYNOPSIS

sed [OPTION]… {script-only-if-no-other-script} [input-file]…

用便于理解的表示其用法如下:

sed [options] ‘AddressCommand’ file …

其中AddressCommand表示对需要处理的范围(地址)执行的命令

2.1 options主要有如下几个常用的:-n: 静默模式,不再默认显示模式空间中的内容

-i: 直接修改原文件

-e SCRIPT -e SCRIPT:可以同时执行多个脚本

-f /PATH/TO/SED_SCRIPTsed -f /path/to/scripts file-r: 表示使用扩展正则表达式

-n:显示出其他资料行的默认操作,只显示符合的数据行,如下面加-n选项和不加的显示效果是不一样的:

eab6ed554f52961d9cad5c5f47320c71.png

2.2 Address

Address表示sed处理的范围,如第20到30行、以root开头的行等等。主要有如下几种:指定行:StartLine,EndLine

5,30 表示第5至30行[root@localhost ~]# sed ‘5,30d’ /etc/passwd    ##删除5至30行内容(不会修改原文件)

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

$ 表示最后一行正则表达式匹配:/RegExp/

sed正则表达式的用法基本与grep一样,如:[root@localhost ~]# sed ‘/nologin$/d’ /etc/passwd   ##删除以nologin结尾的行

root:x:0:0:root:/root:/bin/bash

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

barlow:x:500:500::/home/barlow:/bin/bash/pattern1/,/pattern2/

第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行指定具体的行:LineNumber

从某行开始及后面的多少行:addr1,+N

上面的5,30 等于5,+25[root@localhost ~]# sed ‘5,+25d’ /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

三、Command

在将Command之前,需要再次强调的是,Address和Command之间是直接相连的,中间没有空格或者其他符号。

Command主要有如下这些:d: 删除符合条件的行;参见前面Address部分的示例。

p: 显示符合条件的行;需要注意的是,文章第二段红字部分已经强调了,sed默认会把处理的文本一行行输出到终端,因此直接用p命令看不出什么效果。

a \string: 在指定的行后面追加新行,内容为string,如下面的例子将在文本最后添加一行内容,注意cat看到结果与sed处理结果的差异:

6629af4c329ca34e07cb84968b5979de.png\n:可以用于换行

i \string: 在指定的行前面添加新行,内容为string

r FILE: 将指定的文件的内容添加至符合条件的行处,如在fstab第二行后添加issue文件的内容

1cae7a81c8bff0cfc8886d87385377d7.pngw FILE: 将地址指定的范围内的行另存至指定的文件中;

s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串

修饰符主要有:

g: 全局替换

i: 忽略字符大小写

注意,替换命令的三个/可以用其他字符替换,如:s@pattern@string@修饰符

s#pattern#string#修饰符

这些都是可以的,只要三个分隔符一样即可。&: 引用模式匹配整个串

四、常用用法示例:

1、删除行首空格[root@localhost ~]# sed ‘s/^[ ]*//g’ filename

[root@localhost ~]# sed ‘s/^ *//g’ filename

[root@localhost ~]# sed ‘s/^[[:space:]]*//g’ filename

2、行后和行前添加新行

行后:[root@localhost ~]# sed ‘s/pattern/&\n/g’ filename

行前:[root@localhost ~]# sed ‘s/pattern/\n&/g’ filename

注意:&代表pattern

3、使用变量替换(使用双引号)[root@localhost ~]# sed -e “s/$var1/$var2/g” filename

4、在第一行前插入文本sed -i ‘1 i\插入字符串’ filename

5、在最后一行插入[root@localhost ~]# sed -i ‘$ a\插入字符串’ filename

6、在匹配行前插入[root@localhost ~]# sed -i ‘/pattern/ i “插入字符串”‘ filename

7、在匹配行后插入[root@localhost ~]# sed -i ‘/pattern/ a “插入字符串”‘ filename

8、删除文本中空行和空格组成的行以及#号注释的行[root@localhost ~]# grep -v ‘^#’ filename | sed  ‘/^[[:space:]]*$/d’

9、处理命令结果中的多余空格,将df结果中多个空格分隔的替换为一个:分隔[root@localhost ~]# df -P |sed -r ‘s/[[:space:]]+/:/g’

##-P 选项表示df输出信息不自动换行

##[[:space:]]+匹配表示空格至少出现一次

一、sed (Stream Editor)

1、定位行:

sed -n '12,~3p' pass #从第12行开始,直到下一个3的倍数行(12-15行)

sed -n '12,+4p' pass #从第12行开始,连续4行(12-16行)

sed -n '12~3p' pass #从第12行开始,间隔3行输出一次(12,15,18,21...)

sed -n '10,$p' pass   #从第10行至结尾

sed -n '4!p' pass   #除去第4行

2、正则:'/正则式/'

sed -n '/root/p' /etc/passwd

sed -n '/^root/p' /etc/passwd

sed -n '/bash$/p' /etc/passwd

sed -n '/ro.t/p' /etc/passwd

sed -n '/ro*/p' /etc/passwd

sed -n '/[ABC]/p' /etc/passwd

sed -n '/[A-Z]/p' /etc/passwd

sed -n '/[^ABC]/p' /etc/passwd

sed -n '/^[^ABC]/p' /etc/passwd

sed -n '/\

sed -n '/root\>/p' /etc/passwd

3、扩展正则:

sed -n '/root\|yerik/p' /etc/passwd #拓展正则需要转义

sed -nr '/root|yerik/p' /etc/passwd #加-r参数支持拓展正则

sed -nr '/ro(ot|ye)rik/p' /etc/passwd #匹配rootrik和royerik单词

sed -nr '/ro?t/p' /etc/passwd   #?匹配0-1次前导字符

sed -nr '/ro+t/p' /etc/passwd   #匹配1-n次前导字符

sed -nr '/ro{2}t/p' /etc/passwd   #匹配2次前导字符

sed -nr '/ro{2,}t/p' /etc/passwd   #匹配多于2次前导字符

sed -nr '/ro{2,4}t/p' /etc/passwd #匹配2-4次前导字符

sed -nr '/(root)*/p' /etc/passwd   #匹配0-n次前导单词

4、sed编辑(对行的插入、删除、替换操作)

sed '/root/a admin' /etc/passwd   #在root行后追加一个admin行

sed '/root/i admin' /etc/passwd   #在root行前插入一个admin

sed '/root/c admin' /etc/passwd   #将root行替换为admin

sed '/root/d' /etc/passwd    #删除含有root的行

s替换

sed -n 's/root/admin/p' /etc/passwd

sed -n 's/root/admin/2p' /etc/passwd        #在每行的第2个root作替换

sed -n 's/root/admin/gp' /etc/passwd

sed -n '1,10 s/root/admin/gp' /etc/passwd

sed -n 's/root/AAA&BBB/2p' /etc/passwd       #将root替换成AAArootBBB,&作反向引用,代替前面的匹配项

sed -ne 's/root/AAA&BBB/' -ne 's/bash/AAA&BBB/p' /etc/passwd #-e将多个命令连接起来,将root或bash行作替换

sed -n 's/root/AAA&BBB/;s/bash/AAA&BBB/p' /etc/passwd   #与上命令功能相同

sed -nr 's/(root)(.*)(bash)/\3\2\1/p' /etc/passwd     #将root与bash位置替换,两标记替换

或sed -n 's/\(root\)\(.*\)\(bash\)/\3\2\1/p' /etc/passwd

bash:x:0:0:root:/root:/bin/root

y替换

echo "sorry"|sed 'y/ory/ABC/' #一一对应替换(sABBC)

6、sed的模式空间和保持空间

h:模式---->保持

H:模式--->>保持

x:模式保持

g:保持---->模式

G:保持--->>模式

例如:

111

222

333

444

# sed '1h;2,3H;4G'

分析

CMD         模式     保持

111         111     \n

1h          111     111

----------->111

222         222     111

2,3H        222     111\n222

----------->222

333         333     111\n222

2,3H        333     111\n222\n333

----------->333

444         444     111\n222\n333

4G          444\n111\n222\n333

----------->444\n111\n222\n333

1-10

11-22

22-33

11-22

34-END

7、sed特殊用法

sed -n '/root/w a.txt'    #将匹配行输出到文件

sed '/root/r abc.txt' /etc/passwd #把abc.txt的文件内容读入到root匹配行后

sed -n '/root/w a.txt'

sed -n '/root/{=;p}' /etc/passwd #打印行号和匹配root的行

sed -n '/root/{n;d}' /etc/passwd #将匹配root行的下一行删除

sed -n '/root/{N;d}' /etc/passwd #将匹配root行和下一行都删除

sed '22{h;d};23,33{H;d};44G' pass

8、sed 脚本编写方法

<1>从文件读入命令

sed -f sed.sh

sed.sh文件内容:

s/root/yerik/p

s/bash/csh/p

<2>直接运行脚本 ./sed.sh /etc/passwd

#!/bib/sed -f

s/root/yerik/p

s/bash/csh/p

###################################

二、Sed练习

1,删除文件每行的第一个字符。

sed -n 's/^.//gp' /etc/passwd

sed -nr 's/(.)(.*)/\2/p' /etc/passwd

2,删除文件每行的第二个字符。

sed -nr 's/(.)(.)(.*)/\1\3/p' /etc/passwd

3,删除文件每行的最后一个字符。

sed -nr 's/.$//p' /etc/passwd

sed -nr 's/(.*)(.)/\1/p' /etc/passwd

4,删除文件每行的倒数第二个字符。

sed -nr 's/(.*)(.)(.)/\1\3/p' /etc/passwd

5,删除文件每行的第二个单词。

sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\2\3\5/p' /etc/passwd

6,删除文件每行的倒数第二个单词。

sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4\5\6/p' /etc/samba/smb.conf

7,删除文件每行的最后一个单词。

sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4/p' /etc/samba/smb.conf

8,交换每行的第一个字符和第二个字符。

sed -nr 's/(.)(.)(.*)/\2\1\3/p' /etc/passwd

9,交换每行的第一个单词和第二个单词。

sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/samba/smb.conf

10,交换每行的第一个单词和最后一个单词。

sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/passwd

11,删除一个文件中所有的数字。

sed 's/[0-9]*//g' /etc/passwd

12,删除每行开头的所有空格。

sed -n 's/^\ *//p' /etc/samba/smb.conf

sed -nr 's/( *)(.*)/\2/p' testp

13,用制表符替换文件中出现的所有空格。

sed -n 's/\ /\t/gp' pass

14,把所有大写字母用括号()括起来。

sed -nr 's/([A-Z])/(&)/gp' testp

sed -n 's/[A-Z]/(&)/gp' testp

15,打印每行3次。

sed 'p;p' pass

16,隔行删除。

sed -n '1~2p' pass

17,把文件从第22行到第33行复制到第44行后面。

sed '1,21h;22h;23,33H;44G' pass

18,把文件从第22行到第33行移动到第44行后面。

sed '22{h;d};23,33{H;d};44G' pass

19,只显示每行的第一个单词。

sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)/\2/p' /etc/passwd

20,打印每行的第一个单词和第三个单词。

sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\2--\4/p' /etc/passwd

21,将格式为    mm/yy/dd    的日期格式换成   mm;yy;dd

date +%m/%Y/%d |sed -n 's#/#;#gp'

22, 逆向输出

cat a.txt

ABC

DEF

XYZ

输出样式变成

XYZ

DEF

ABC

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值