sed工具

简介:

sed工具可以将进行数据的替换,删除,选取特定行等功能。

语法:

sed [-nref] ‘[n1[,n2]]function’

参数:

-n:在一般的sed的用法中,所有来自标准输入的数据行一般后会被列出到屏幕上,但是如果加上-n参数,就只会显示经过sed特殊处理的那部分数据。

-e:直接在命令行模式上进行sed的动作。

-f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。

-r:sed的动作支持的是扩展型正则表达式的语法(默认是基础的正则表达式)。

-i:直接修改读取的文件内容,而不是由屏幕输出。

 

n1,n2:可以不存在这两个数字,代表选择进行sed动作的行数。2,5表示将在2-5行数据上进行sed动作。

function参数:

a 新增,a后面可以接字符串,这些字符串会在新的一行出现(当前行的下一行)

c 替换,c后面可以接字符串,这些字符串可以替换n1,n2之间的行。

d 删除 d后面一般不接任何参数

i  插入 i后面可以是字符串,这些字符串会在新的一行出现(当前行的上一行)

p 打印 也就是将某个选择的数据打印出来,通常p会与参数sed -n 一起运行

s 替换,可以直接进行替换的工作,通过这个s的动作可以搭配正则表达式。

 

删除3-5行:

1
2
3
4
5
6
7
[whx@localhost ~]$  nl  /etc/passwd  sed '3,5d'
     1  root:x:0:0:root: /root : /bin/bash
     2 bin:x:1:1:bin: /bin : /sbin/nologin
     6   sync :x:5:0: sync : /sbin : /bin/sync
     7   shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown
     8 halt:x:7:0:halt: /sbin : /sbin/halt

删除存在root字符串的行:

1
2
3
4
5
[whx@localhost ~]$  nl  /etc/passwd  sed '/root/d'
     2  bin:x:1:1:bin: /bin : /sbin/nologin
     3 daemon:x:2:2:daemon: /sbin : /sbin/nologin
     4 adm:x:3:4:adm: /var/adm : /sbin/nologin

删除root到ftp之间的行(包含root,ftp所在的行):

1
2
3
4
5
6
[whx@localhost ~]$  nl  /etc/passwd  sed '/root/,/ftp/d'
    15 nobody:x:99:99:Nobody:/: /sbin/nologin
    16  dbus:x:81:81:System messagebus:/: /sbin/nologin
    17  usbmuxd:x:113:113:usbmuxduser:/: /sbin/nologin
       18 rtkit:x:499:499:RealtimeKit: /proc : /sbin/nologin

在第2行之后添加just like it:

1
2
3
4
5
6
7
[whx@localhost ~]$  nl  /etc/passwd  sed  '2ajust like it'
     1  root:x:0:0:root: /root : /bin/bash
     2 bin:x:1:1:bin: /bin : /sbin/nologin
just like it
     3  daemon:x:2:2:daemon: /sbin : /sbin/nologin
     4 adm:x:3:4:adm: /var/adm : /sbin/nologin

在第2行之后添加多行数据时需要\符号来分隔需要添加的各行:

1
2
3
4
5
6
7
8
[whx@localhost ~]$  nl  /etc/passwd  sed  '2ajust like it \
> you are not alone'
     1  root:x:0:0:root: /root : /bin/bash
     2 bin:x:1:1:bin: /bin : /sbin/nologin
just like it
you are not alone
      3 daemon:x:2:2:daemon: /sbin : /sbin/nologin

在第2行之前添加多行数据:

1
2
3
4
5
6
7
[whx@localhost ~]$  nl  /etc/passwd  sed  '2ijust like it \
you are not alone'
     1  root:x:0:0:root: /root : /bin/bash
just like it
you are not alone
     2 bin:x:1:1:bin: /bin : /sbin/nologin

将2-6行替换为data line 2-6:

1
2
3
4
5
6
[whx@localhost ~]$  nl  /etc/passwd  sed '2,6c data line 2-6'
     1  root:x:0:0:root: /root : /bin/bash
data line 2-6
     shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown
     8 halt:x:7:0:halt: /sbin : /sbin/halt

单独打印3-6行:

1
2
3
4
5
6
[whx@localhost ~]$  nl  /etc/passwd  sed -n   '3,6p'
     3 daemon:x:2:2:daemon: /sbin : /sbin/nologin
     4 adm:x:3:4:adm: /var/adm : /sbin/nologin
     5 lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin
     6   sync :x:5:0: sync : /sbin : /bin/sync

如果不添加-n参数,则会全部打印并且3,6行会重复打印:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[whx@localhost ~]$  nl  /etc/passwd  sed '3,6p'   
     1  root:x:0:0:root: /root : /bin/bash
     2 bin:x:1:1:bin: /bin : /sbin/nologin
     3 daemon:x:2:2:daemon: /sbin : /sbin/nologin
     3 daemon:x:2:2:daemon: /sbin : /sbin/nologin
     4 adm:x:3:4:adm: /var/adm : /sbin/nologin
     4 adm:x:3:4:adm: /var/adm : /sbin/nologin
     5  lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin
     5 lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin
     6   sync :x:5:0: sync : /sbin : /bin/sync
     6   sync :x:5:0: sync : /sbin : /bin/sync
     shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown
     8  halt:x:7:0:halt: /sbin : /sbin/halt
     9 mail:x:8:12:mail: /var/spool/mail : /sbin/nologin

替换字符

sed ‘/s/被替换的字符串/新的字符串/g’ ,使用sed替换字符通常可以与正则表达式一起使用。

查看/sbin/ifconfig中存在inet addr字符串的行:

1
2
[whx@localhost ~]$  /sbin/ifconfig  eth0 | grep  'inet addr'
          inet addr:192.168.21.130 Bcast:192.168.21.255 Mask:255.255.255.0

将上面的数据行中从开头位置到add:的内容删除:

1
2
[whx@localhost ~]$  /sbin/ifconfig  eth0 | grep  'inet addr'  sed  's/^.*addr://g'
192.168.21.130  Bcast:192.168.21.255  Mask:255.255.255.0

将之前查询出来的数据从开头到add:之间的内容和Bcast到结尾之间的内容删除:

1
2
[whx@localhost ~]$  /sbin/ifconfig  eth0 | grep  'inet addr'  sed  's/^.*addr://g' sed  's/Bcast.*$//g'
192.168.21.130

 

将文件中存在MAN的数据行中#符号及其之后的内容删除(删除后发现文件中存在大量空白行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[whx@localhost ~]$  cat   . /man .config.b |  grep  'MAN'  sed  's/#.*//g'
  
  
  
  
MANPATH  /usr/man
MANPATH  /usr/share/man
MANPATH  /usr/local/man
MANPATH  /usr/local/share/man
MANPATH  /usr/X11R6/man
  
  
  
  
  
MANPATH_MAP      /sbin                    /usr/share/man
MANPATH_MAP      /usr/bin                 /usr/share/man
MANPATH_MAP      /usr/sbin                /usr/share/man
MANPATH_MAP      /usr/local/bin           /usr/local/share/man
MANPATH_MAP      /usr/local/sbin          /usr/local/share/man
MANPATH_MAP      /usr/X11R6/bin           /usr/X11R6/man
MANPATH_MAP      /usr/bin/X11             /usr/X11R6/man
MANPATH_MAP      /usr/bin/mh              /usr/share/man
  
MANSECT        1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

将文件中存在MAN的数据行中#符号及其之后的内容删除并且删除空白行(^$为正则表达式表示空白行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[whx@localhost ~]$  cat   . /man .config.b |  grep  'MAN'  sed 's/#.*//g' | sed  '/^$/d'
MANPATH  /usr/man
MANPATH  /usr/share/man
MANPATH  /usr/local/man
MANPATH  /usr/local/share/man
MANPATH  /usr/X11R6/man
MANPATH_MAP      /sbin                    /usr/share/man
MANPATH_MAP      /usr/bin                 /usr/share/man
MANPATH_MAP      /usr/sbin                /usr/share/man
MANPATH_MAP      /usr/local/bin           /usr/local/share/man
MANPATH_MAP      /usr/local/sbin          /usr/local/share/man
MANPATH_MAP      /usr/X11R6/bin           /usr/X11R6/man
MANPATH_MAP      /usr/bin/X11             /usr/X11R6/man
MANPATH_MAP      /usr/bin/mh              /usr/share/man
MANSECT        1:1p:8:2:3:3p:4:5:6:7:9:0p:n:l:p:o:1x:2x:3x:4x:5x:6x:7x:8x

 

直接修改文件:

添加-i参数可以利用sed直接对文件进行操作,这对于大文件很有用,这可以很方便替换,删除,添加大量数据。

将man.config.b中以每行末尾的.符号替换为!:

1
2
3
4
5
6
7
8
9
10
11
[whx@localhost ~]$  sed  -i  's/\.$/\!/g' man .config.b
[whx@localhost ~]$  cat  man .config.b
#
# Generated automatically from man.conf.inby the
# configure script!
#
# man.conf from man-1.6f
#
# For more information about this file, seethe man pages man(1)
# and man.conf(5)!

在man.config.b的末尾添加#justadd a line to test:

1
2
3
4
5
6
7
[whx@localhost ~]$  sed  -i  '$a #just add aline to test'  man .config.b  
[whx@localhost ~]$  cat  man .config.b |  tail -n 5
# Otherwise the database will be updated!
#
# Set up PATH to MANPATH mapping
#MAKEWHATISDBUPDATES    n
#just add a line to test


本文转自 天黑顺路 51CTO博客,原文链接:http://blog.51cto.com/mjal01/1959348,如需转载请自行联系原作者
相关文章
|
JSON 数据可视化 Java
103.【Java Microbenchmark Harness】(六)
103.【Java Microbenchmark Harness】
99 0
103.【Java Microbenchmark Harness】(六)
|
12月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
442 3
|
自然语言处理 IDE 测试技术
阿里云 的 通义灵码 在 IDEA 使用
【7月更文挑战第1天】在IntelliJ IDEA中启用阿里云的通义灵码插件,需安装插件,搜索“tongyi”安装并登录阿里云账号。插件提供行级/函数级代码建议、自然语言生成代码、单元测试生成、代码注释和解释等功能。支持多种编程语言,但需联网使用并依赖阿里云账号。快捷键在macOS和Windows上有差异,如macOS的“Tab”键接受代码建议,“Esc”废弃。
2229 0
|
存储 缓存 算法
给函数起个好名字—动词选择
给函数起个好名字—动词选择
532 0
|
Unix 网络安全
rsync超级光速传输脚本
rsync超级光速传输脚本
|
Go 开发者
for 循环注意事项和细节(2)| 学习笔记
快速学习 for 循环注意事项和细节(2)
for 循环注意事项和细节(2)| 学习笔记
java代码命名规范
java代码命名规范
2835 1
|
数据可视化
号外号外,DataV新增拓展包来啦,帮你实现更强大的可视化!
新增高级交互组件拓展包、组件收藏数量扩展包、屏幕数量拓展包
3607 0
|
Web App开发 Windows
|
前端开发 JavaScript
React 中的 定义组件的 两种方式
React 中创建 Components 的方式有两种:Function and Class 定义一个组件最简单的方法就是写一个 JavaScript 函数 function Welcome(props) { return Hello, {props.name} } 因为Welcome函数接受单个携带数据的props对象并且返回一个React元素,所以它就是一个组件。
1418 0