linux-sed命令

sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。

sed命令的语法格式

sed的命令格式: sed [option] 'sed command' filename    或   sed [option]  "sed command" filename 

    sed里单引号和双引号的区别:双引号里可以使用shell里的变量,单引号不能;单引号和双引号里都可以存放模式。

sed的脚本格式:sed [option] -f 'sed script' filename

sed命令的选项(option):

--help :命令帮助

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

-r :支持扩展表达式

-i :直接修改文件内容

sed在文件中查询文本的方式-寻址方式adress

使用行号,可以是一个简单数字,或是一个行号范围

x

x为行号

sed -n '3p' text.txt

x,y

表示行号从x到y

sed -n '1,3p' text.txt

/pattern/

查询包含模式的行

sed -n '/This/p' text.txt

/pattern/{/pattern/}

查询包含两个模式的行

sed -n '/This/{/is/p}' text.txt

/pattern/,x

在给定行号上查询包含模式的行

sed -n '/That/,3p' text.txt

x,/pattern/

通过行号和模式查询匹配的行

sed -n '2,/They/p' text.txt

x,y!

查询不包含指定行号x和y的行

 

默认情况下,sed 命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须写明 address 部分,表示的方法有以下 2 种:

  1. 以数字形式指定行区间;
  2. 用文本模式指定具体行区间。

以上两种形式都可以使用如下这 2 种格式,分别是:

[address]脚本命令

或者

address {
    多个脚本命令
}

sed的编辑命令(sed command):

直接命令来展示示例:text.txt的内容如下

This is the first line.content:1
This is the second line.content:2
This is the third line.3
this is the fourth.4

命令意义规则格式

示例(所有的命令,只有在加入 -i 参数之后才会直接对文件修改,否则只是会打印在控制台上,并不会对文件做修改。

打印所有行(和-n选项一起合用表示打印匹配行)

sed '[adress]p' filenamesed '2p' text.txt  :打印所有行,第二行打印两遍。sed 'p' text.txt  :打印所有行,每行打印两遍。sed -n '2p' text.txt  :打印第二行, sed -n 'p' text.txt  :打印每一行
P(大写) 打印模板块的第一行。  

=

显示文件行号

sed '[adress]=' filenamesed '=' text.txt :每行都打印行号和内容。sed '2=' text.txt :打印第二行的行号和内容

a\

在定位行号后的新一行附加新文本信息,相当于增加一行。

sed '[adress]a [content]' filename  或   sed '[adress]a\[content]' filename 或   sed '[adress] a\[content]' filenamesed '3 a\addcontent' text.txt  或   sed '3 a\addcontent' text.txt  或   sed '3a addcontent' text.txt   :在三行后的加入一行(第四行)文本addcontent 

i\

在定位行号插入新文本信息,原来这一行的内容变成下一行

sed '[adress]i [content]'  filename  或   sed '[adress]i\[content]'  filename  或   sed '[adress] i\[content]' filename sed '3 i\addcontent' text.txt  或   sed '3 i\addcontent' text.txt  或   sed '3i addcontent' text.txt   :在三行后的加入一行(第四行)文本addcontent 

d

删除定位行

sed '[adress]d' filename sed '3 d' text.txt  或 sed '3d' text.txt  : 删除第三行
D删除模板块的第一行。
 
  

c\

用新文本替换定位文本

sed '[adress]c [new line content]'  filename  或   sed '[adress]c\[new line content]'  filename  或   sed '[adress] c\[new line content]' filename 

sed '3c\change lin3' text.txt 或  sed '3c change lin3' text.txt sed '3 c\change lin3' text.txt   : 将第三行的内容改为   change lin3

w filename

写文本到一个文件,类似输出重定向 >

sed '[adress]w destfilename' sourcefilenamesed '3w text1.txt' text.txt  :  将text.txt 的第三行数据复制到 text1.txt中。sed 'w text1.txt' text.txt  :  将text.txt 的数据复制到 text1.txt中。如果text.txt为空,则会从第二行开始插入数据

r filename

从另一个文件中读文本,类似输入重定向 <

sed ‘[address]r sourcefilename’  destfilenamesed '1r 1111.txt' text.txt : 将111.txt中的内容插入到 text.txt的第一行后面。 sed 'r 1111.txt' text.txt : 将111.txt中的内容插入到 text.txt的每一行后面。 

s

使用替换模式替换相应模式

sed '[address]s/[word1]/[word2]' filename   . 如果word2有&字符,表示追加在匹配的字符word1前追加&前的内容。word1后追加&后的内容。sed -i 's/before/after/' text.txt : 将text.txt每一行的第一个before单词替换为aftersed -i 's/before/after/g' text.txt : 将text.txt每一行的每一个before单词替换为after。sed 's/^/start /' text.txt  :在每一行的开始添加 “start ” 单词。sed 's/$/ end/' text.txt 在每一行的结束添加 “end ” 单词

q

第n个模式匹配完成后退出或立即退出

sed'[command];[adress]q' filename

sed 's/before/after/;2q' text.txt : 将text.txt每一行的第一个before单词替换为after,只替换到第二行

l

显示与八进制ACSII代码等价的控制符

  

{}

在定位行执行的命令组,用分号隔开

sed '命令1{命令2} ' filename

匹配命令1的数据执行命令2。sed '/keyword/{d}' text.txt : 对匹配 keyword 关键词的行进行删除。 

n

从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理

sed '[adress]n;[command]’filename

sed 'n;s/before/after/' text.txt   :  从text.txt文件的第1行开始读数据,对第二行开始执行‘s/before/after/’命令。 然后从3 行开始读;第4行执行命令。sed 'n;d' text.txt : 删除2,4,6,8....行。sed '[adress]n;s/before/after/' text.txt  : 表示对匹配[adress]的数据行不进行操作。

N

追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。set '[command1]N;[command]'  :读入第一行是否匹配,匹配,则执行N命令-读入第二行,执行command命令;不匹配,直接执行command命令 

g

将模式2粘贴到/pattern n/。获得内存缓冲区的内容,并替代当前模板块中的文本。

sed '[address]/g' filenamesed -i 's/before/after/g' text.txt : 将text.txt每一行的每一个before单词替换为after
G获得内存缓冲区的内容,并追加到当前模板块文本的后面。
 
  

y

传送字符,替换单个字符。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母, a-->A,b-->B,c-->C。

sed '[command]y/[origin-char]/[dest-char]/' filenamesed 'y/Tt/tT' text.txt : 将每一个T->t ,t->T
!
 
表示后面的命令对所有没有被选定的行发生作用。sed '[command]![command1]' : 对没有匹配command的行做command1命令sed -n '1,2!p' text.txt :打印出了1,2行的所有行

Sed 的正则表达式

元字符功 能示 例示例的匹配对象
^行首定位符/^love/匹配所有以 love 开头的行
$行尾定位符/love$/匹配所有以 love 结尾的行
.匹配除换行外的单
个字符
/l..e/匹配包含字符 l、后跟两个任意
字符、再跟字母 e 的行
*匹配零个或多个前
导字符
/*love/匹配在零个或多个空格紧跟着
模式 love 的行
[]匹配指定字符组内
任一字符
/[Ll]ove/匹配包含 love 和 Love 的行
[^]匹配不在指定字符
组内任一字符
/[^A-KM-Z]ove/匹配包含 ove,但 ove 之前的那
个字符不在 A 至 K 或 M 至 Z 间
'/\(They\| second\| content\)/p'的行
\(..\)保存已匹配的字符'/\(word1\|word2\|word3\)/p'打印匹配word1、Word2、word3中任意一个的行
&保存查找串以便在
替换串中引用
s/love/**&**/符号&代表查找串。字符串 love
将替换前后各加了两个**的引
用,即 love 变成**love**
\<词首定位符/\<love/匹配包含以 love 开头的单词的
\>词尾定位符/love\>/匹配包含以 love 结尾的单词的
x\{m\}连续 m 个 x/o\{5\}/分别匹配出现连续 5 个字母 o、
至少 5 个连续的 o、或 5~10 个
连续的 o 的行
x\{m,\}至少 m 个 x/o\{5,\}/ 
x\{m,n\}至少 m 个 x,但不
超过 n 个 x
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值