sed 命令的使用

sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可
能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。

可以在命令行输入sed命令,也可以在一个文件中写入命令,然后调用sed,这与awk基本
相同。使用sed需要记住的一个重要事实是,无论命令是什么, sed并不与初始化文件打交道,
它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。
因为sed是一个非交互性编辑器,必须通过行号或正则表达式指定要改变的文本行。

 

调用sed有三种方式:在命令行键入命令;将sed命令插入脚本文件,然后调用sed;将sed
命令插入脚本文件,并使sed脚本可执行。

使用sed命令行格式为:
sed [选项] sed命令输入文件。
记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。

使用sed脚本文件,格式为:
sed [选项] -f sed脚本文件输入文件
要使用第一行具有sed命令解释器的sed脚本文件,其格式为:

sed脚本文件[选项] 输入文件
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中
接受输入,一般是键盘或重定向结果

 

 

sed选项:
n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以
用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,
此选项无用,但指定它也没有关系。
f 如果正在调用sed脚本文件,使用此选项。此选项通知sed一个脚本文件支持所有的sed命令,例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件。

 

保存sed输出
由于不接触初始化文件,如果想要保存改动内容,简单地将所有输出重定向到一个文件即可.

sed ‘command’inputfile > myoutfile

 

 

sed [-nefr]

-n 使用安静模式silent 在一般sed的用法中,所有来自STDIN的数据都会被列在屏幕上,但-n 只显示经过sed特殊处理的那一行 才会被列出来

-e 直接在命令行模式进行sed的编辑

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

-r sed的动作支持的是扩展型正则表达式语法

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

 

 

使用sed在文件中查询文本的方式

1:使用行号,可以是一个简单数字,或是一个行号范围。
2:使用正则表达式

x   x为一行号,如1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行。例如/disk/或/[a-z]/

/pattern/pattern/ 查询包含两个模式的行。例如/disk/disk/
pattern/,x   在给定行号上查询包含模式的行。如/ribbon/,3
x,/pattern/  通过行号和模式查询匹配行。3./vdu/
x,y! 查询不包含指定行号x和y的行。1,2!

 

基本sed编辑命令

p 打印匹配行
= 显示文件行号
a \ 在定位行号后附加新文本信息 下一行
i \ 在定位行号后插入新文本信息 上一行
d 删除定位行
c \ 用新文本替换定位文本

s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制ASCII代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句

 

 

以lianxi.txt为例子:

lianxi.txt 
The honetsuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too Bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance

 

使用p显示行

sed '2p' lianxi.txt 

原意只打印第二行,但是却打印了文件中所有行,为此需使用- n选项,显示打印定位(匹配)行。

sed -n '2p' lianxi.txt 

打印范围
可以指定行的范围,现打印1到3行,用逗号分隔行号。

sed -n '1,3p' lianxi.txt 
打印模式
假定要匹配单词disco,并打印此行,方法如下。使用模式/pattern/格式,这里为/disco/。

sed -n '/disco/'p lianxi.txt 
使用模式和行号进行查询

使用模式与行号的混合方式可以剔除第一行,格式为linenumber,/pattern/。逗号用来分
隔行号与模式开始部分。为达到预期结果,使用4,/The/。意即只在第四行查询模式the.

sed -n '4,/The/p' lianxi.txt

匹配元字符
匹配元字符$前,必须使用反斜线\屏蔽其特殊含义。模式为/\$/p。

sed -n '/\$/p' lianxi.txt 
显示整个文件
要打印整个文件,只需将行范围设为第一行到最后一行1,$。 $意为最后一行。

sed -n '1,$'p lianxi.txt

任意字符
匹配任意字母,后跟任意字母的0次或多次重复,并以ing结尾,模式为/.*ing/。可以使用这个模式查询以ing结尾的任意单词。

sed -n '/.*ing/' lianxi.txt

首行和末行

sed -n '1p' lianxi.txt   |    sed -n '$p' lianxi.txt

打印行号
要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/=。

sed -n '/music/=' lianxi.txt
整个文件都打印出来,并且匹配行打印了行号。如果只关心实际行号,使用-e选项。

sed -e '/music/=' lianxi.txt

如果只打印行号及匹配行,必须使用两个sed命令,并使用e选项。第一个命令打印模式
匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。

sed -n -e '/music/'p -e '/music/=' lianxi.txt

附加文本
要附加文本,使用符号a\,可以将指定文本一行或多行附加到指定行。 多行插入后边加上 \

sed -i '/company/ a\ Then suddenly it happened' lianxi.txt

插入文本 在第4行下边插入 alca.lai

sed -i '4 i\ alca.lai ' lianxi.txt

替换文本 将alca.lai 替换成Kalpana  

sed -i '/alca.lai/ c\ Kalpana' lianxi.txt

也可以使用行号直接代替:sed -i '3 c\ Kalpana' lianxi.txt

删除文本

sed -i '/kalpana/'d lianxi.txt

 

查找IP 以ifconfig 为例子

/sbin/ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' |sed 's/Bcast.*$//g'

 

替换文本

替换文本
替换命令用替换模式替换指定模式,格式为:
s/ pattern-to-find /replacement-pattern/[g p w n]

查询出pattern-to-find 替换为replacement-pattern

后边选项:g p w n

替换选项如下:
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
p 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出
结果。
w 文件名使用此选项将输出定向到一个文件。

The 替换成Wow! 并将所改的行 另存到tihuan

nl lianxi.txt | sed  -n 's/The/Wow!/w tihuan'

如果全部保存 可以使用追加导入

nl lianxi.txt | sed  -n 's/The/Wow!/' > tihuan

大写替换小写

sed 's/\L[a-z]/\u&/g' lianxi3.txt

 

 

 

1)请把每个单词的第一个字母替换成大写。
sed 's/\b[a-z]/\u&/g
[解析]

\b大家应该知道是锚定的意思,说白了就是边界符,那么这就只会匹配第一个开头的字母,

\U的意思在元字符里的解释是“大写(不是标题首字符)\E 以前的字符”,

\u只是将下一个字符变为大写,注意它们的区别噢

\L的意思在元字符里的解释是全部换成小写

\l只是将下一个字符变为小写

 

 

2)全文大小写转换
echo "aBcDE" | tr a-z A-Z
echo "aBcDE" | tr A-Z a-z

 

3)大小写对换
echo "aBcDE" | tr '[a-zA-Z]' '[A-Za-z]

4)文件名大小写替换
比如说:a.txt b.txt c.txt
更名变成 A.txt B.txt C.txt 
ls *.txt|sed -nr 's/(.)(\..*)/mv & \u\1\2/e'

[解析]
\u 是转换后面的内容第一个字母为大写,\U是全部为大写直到遇到 \E 为止。这就是区别:

echo 'abc'|sed 's/^../\u&/'
Abc
echo 'abc'|sed 's/^../\U&\E/'
ABc

posted @ 2021-01-14 14:02  岁月倾城CTO  阅读(181)  评论(0编辑  收藏  举报