Linuxshell脚本之蛋疼Sed简介正则表达式

Sed简介
sed是一款轻量级流编辑器,是stream editor的简写。由于sed是以行为单位进行编辑文件 , 因此也称为行编辑器。它无需直接编辑资料,能够将编辑工作自动化。
sed工作方式:
由标准输入读取编辑文件,读入一行或指定行放到模式空间,然后将所有编辑指令逐一对模式空间的内容进行编辑,之后将结果输出到标准输出,同时清除模式空间。接下来再将下一行资料读入模式空间,如此重复之前的操作,直到最后一行,流编辑器停止。源文件不变
Ps:
1、模式空间为读入行所在的缓存,sed对文本行进行的处理都是在这里进行的
2、一次操作一行, 按顺序逐行应用命令
3、sed命令执行与返回数据几乎同时进行的,在处理每一行数据的将同时就显示结果
4、文件内容存在模式空间,并没有改变,除非使用重定向存储输出,因而不会修改原文件

语法:
由编辑指令与文件组成
1、# sed [sed选项] ‘sed命令‘ 要修改的文件 > 新文件
2、# sed [sed选项] -f sed脚本 要修改的文件
3、# sed脚本 [sed选项] 要修改的文件

参数(sed选项):

-e command:--expression=command:进行多项编辑,表示将后续的字符串解析为sed编辑命令,对输入行应用多条sed命令时使用。
    # sed -e ‘1,5d‘ -e ‘s/boy/girl/‘ dodo
    # sed --expression=‘1,5d‘ --expression=‘s/boy/girl/‘ dodo
-e script-file:--expression=script-file:调用指定的sed脚本文件来处理输入的文本文件
-f script-file:--filer=script-file:调用指定的sed脚本文件来处理输入的文本文件
-h:--help:打印帮助
-i:直接修改读取的源文件(默认不修改源文件)
    也可以先备份源文件然后再修改,格式如下:
    # sed -i.bak ‘1d‘ filename
-n:--quiet, --silent:取消默认的输出,仅打印匹配模式的行(默认输出所有内容)
-r:sed的动作支持延伸型正规表示法的语法。(默认为基础正规表示法语法)
-V:--version:显示版本信息

sed命令

a\ :     在定位行号后面加入一行或多行文本。(加入多行时除最后一行每行末尾需用"\"续行)
b lable: 将执行的指令跳至由":"建立的参考位置,如果不存在参考位置则跳转到脚本的末尾
c\:      用新的文本替换定位行的文本。
d:       删除定位行
D:       删除模式空间内的第一行
g:       把当前保持缓冲区中的内容复制到模式空间,替换掉了模式空间中当前行的内容
G:       把当前保持缓冲区中的内容追加到模式空间,追加到了模式空间的当前行后
h:       把模式空间的内容复制到当前保持缓冲区中,把原来暂存缓冲区的内容清除,添加新内容
H:       把模式空间的内容复制到当前保持缓冲区中,追加在保持缓冲区中原有内容的后面
i\:      在定位行号前面插入一行或多行文本。
l:       以可见的严格的形式列出当前模式空间中的内容
n:       读取下一个输入行,用下一个命令处理新的行
N:       追加下一个输入行到模式空间。
p:       打印匹配行
P:       打印模式空间的第一行
q:       第一个模式匹配完成后就退出Sed
r file:  从文件中读取输入行
s:       用一个字符串替换另一个字串。(默认为替换每一行中的第一个)
t label: 如果s指令发生替换操作成功,则跳到":"标记的地方,即使已经读入输入的最后一行,如果没有没有标记则到脚本末尾
T label: 如果s指令发生替换操作失败,则跳到":"标记的地方,即使已经读入输入的最后一行,如果没有没有标记则到脚本末尾
w:       将当前模式空间中的全部内容写入到文件中
W:       将当前模式空间中的第一行写入到文件中
x:       交换模式空间和文本的内容
y:       转换字元,把一个字符翻译为另外的字符(但是不用于正则表达式)
: label: 建立参考位置
{} :     有相同位址参数的指令组
#:       把注释扩展到下一个换行符之前
=:       显示文件行号
!:       不执行选中行的命令,只对所选行以外的行应用命令

元字符集

sed支持特殊元字符,来进行模式查找、替换
^:          行首定位符。如:/^doiido/匹配所有以doiido开头的行
$:          行尾定位符。如:/doiido$/匹配所有以doiido结尾的行
^$:         表示空白行
.:          匹配换行符以外的字符。如:/d...do/ 匹配d后面接3个任意字符,然后do。
*:          匹配零个或多个前导字符。如:/doiido*/ 匹配所有以doiid开头,后面跟零个或多个o的行
[]:         匹配指定字符组内的任一字符。如:/[Dd]oiido/ 匹配所有包含doiido或Doiido的行
[^]:        匹配不在指定字符组内的任一字符。如:/[^Dd]oiido/ 匹配所有不是以D或者d开头的但是以oiido结尾的行
\(..\):     保存已匹配的字符。如:s/\(hello\)doiido/\1baby 这里把hello保存为标签1,如果发现hellodoiido则替换成helloboy,最多可以定义9个标签
&:          保存查找字符串用来替换其他字符串。如:s/doiido/--&--/,符号&代表查找字符串,doiido将变成--doiido--
\<:         词首定位符。如:/\<doiido/ 匹配所有包含有以doiido开头的单词的行。 
\>:         词尾定位符。如:/doiido\>/ 匹配所有包含有以doiido结尾的单词的行。
x\{m\}:     连续m个x。如:/2\{8\}/ 匹配所有包含连续8个2的行。 
x\{m,\}:    至少m个x。如:/2\{8,\}/ 匹配所有包含至少连续8个2的行。
x\{m,n\}:   至少m个x,但不多于n个。如:/2\{6,8\}/ 匹配所有包含连续6个到8个2的行。

Ps:匹配元字符$前,必须使用反斜线\屏蔽其特殊含义。比如/\$/

字符类扩展:

[]:          可以和"-"配合使用
[a-z]:       匹配所有的小写字母
[0-9]:       匹配所有的数字
[:space:]:   匹配空格
[:alnum:]:   匹配字母数字 [a-z A-Z 0-9]
[:alpha:]:   匹配字母 [a-z A-Z]
[:blank:]:   匹配 空格或制表键
[:cntrl:]:   匹配 任何控制字符
[:digit:]:   匹配数字 [0-9]
[:graph:]:   匹配任何可视字符(无空格)
[:lower:]:   匹配小写 [a-z]
[:print:]:   匹配非控制字符
[:punct:]:   匹配标点字符
[:space:]:   匹配空格
[:upper:]:   匹配大写 [A-Z]
[:xdigit:]:  匹配十六进制数字 [0-9 a-f A-F]

字符类例子:

^[0-9]:          表示行第一个字符为任意数字
^[0-9]*:         表示行首包含任意个数的数字
[0-9][0-9]*$:    表示行尾包含至少2个数字
s/\.$//g :       删除以句点结尾的行的句点
s/^[ ][ ]*//:    删除行首的任意个空格
s/^.//:          删除行首的第一个字符
s/^\///:         删除行首的“/”字符
s/SP\(..\)//g:   删除字符“SP”以及紧跟其后的两个任意字符,“SPLLY”-->“Y”
^#/:             以 ‘#‘ 开始的任何行匹配
/}^/ :           将与以 ‘}‘(无空格)结束的任何行匹配
/} *^/ :         将与以 ‘}‘ 后面跟有 零或多个空格结束的任何行匹配 
/[abc]/ :        将与包含小写 ‘a‘、‘b‘ 或 ‘c‘ 的任何行匹配
/^[abc]/ :       将与以 ‘a‘、‘b‘ 或 ‘c‘ 开始的任何行匹配

位置参数:
在默认情况下,在sed编辑器中使用的命令应用于所有文本数据行。
如果仅想将某个命令应用于某一特定的数据行或一组文本数据行,则必须使用行寻址。
行寻址通过定址来定位你所希望编辑的行,是由数据,正则表达式或者二者结合的方式确定。行寻址的格式有如下几种:

x                      x为指定行号
$                      最后一行
x,y                    指定从x到y的行号范围
/pattern/              查询包含模式的行
/pattern/pattern/      查询包含两个模式的行
/pattern/,x            从与pattern的匹配行到x号行之间的行
x,/pattern/            从x号行到与pattern的匹配行之间的行
x,y!                   不包括x和y行号的行

位址参数的个数 :
当只有1个位址参数时,表示只有符合位置参数的资料行才编辑
当有2个位址参数时,如x,y时,表示对x到y的行号范围资料区执行编辑。(包括x和y)

引号语法
1、单引号下,不会对$和后引号`进行解释和执行,即把这两个月当成普通字符
2、双引号下,美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替后引号中的内容。
因此平时要使用单引号‘‘,使用变量时使用双引号""
使用变量时:# sed "/$hello/d" dodo
sed退出状态:
1、不管是否找到指定的模式,退出状态都是0。
2、当命令存在语法错误时,sed的退出状态不是0。
转义:
如果需要使用到斜杠"/",就需要先对其转移,转义一般有以下两种
1:[/]
2:\/

单行使用多条语句
1、在命令之间使用分号
# sed -n ‘=;p‘ dodo

2、使用大括号
# sed -n ‘3{
> =
> p}‘ dodo

3、使用-e参数
# sed -n -e ‘=‘ -e ‘p‘ dodo

4、使用脚本文件,然后使用-f引用
# sed -f scirpt dodo

5、bash shell中可以使用次提示符‘‘
# sed -i ‘
>s/boy/girl/
>s/hello/byebye/‘ data

其他sed使用注意:
1、如果不使用地址,命令将应用到所有行
2、默认情况只会替换各行中首次出现的文本,如果一行中有多个需要替换,则需要替换标记
3、如果要定位一特殊字符,则必须使用"\"或者"[]"屏蔽其特殊含义

========================脚本==========================
脚本:Sed脚本就是写在文件中的一列sed命令,启动Sed时以-f选项引导脚本文件名。

脚本工作方式:
执行脚本时,sed先将输入文件中第一行复制到模式空间,然后对其执行脚本中所有的命令。一行处理完毕后,sed再复制文件中下一行到模式空间,对其执行脚本中所有命令。直到最后一行。

脚本注意项:
1、脚本中,在命令的末尾不能有任何空白或文本
2、如果在一行中有多个命令,要用分号分隔。
3、以#开头的行为注释行,且不能跨行。

脚本格式:
#!/bin/sed -f
command1
command2

脚本实例:
# cat test.sed
#!/bin/sed -f
/hello/a\
hi boy doiido
2i\
you are great

添加权限并执行
# chmod u+x test.sed
# ./test.sed dodo

时间: 2024-10-06 02:51:49

Linuxshell脚本之蛋疼Sed简介正则表达式的相关文章

linux-shell脚本命令之sed

[ sed简介: ] sed是一个很好的文件处理工具, 它本身是一个管道命令, 以行为单位进行处理, 可以用于对数据行进行新增.选取.替换.删除等操作. sed命令行格式:sed [-nefri] 'range command' file 如: sed '2d' aaa.txt                                   # 删除文件aaa.txt中第二行 [ sed工作流程: ] 使用vim这种屏幕编辑器编辑一个文件的时候, 我们需要把这个文件打开, 这里存在两个问题:

Linux shell脚本之 Sed 简介 正则表达式

Sed简介 sed是一款轻量级流编辑器,是stream editor的简写.由于sed是以行为单位进行编辑文件 , 因此也称为行编辑器.它无需直接编辑资料,能够将编辑工作自动化. sed工作方式: 由标准输入读取编辑文件,读入一行或指定行放到模式空间,然后将所有编辑指令逐一对模式空间的内容进行编辑,之后将结果输出到标准输出,同时清除模式空间.接下来再将下一行资料读入模式空间,如此重复之前的操作,直到最后一行,流编辑器停止.源文件不变 Ps: 1.模式空间为读入行所在的缓存,sed对文本行进行的处

linux-shell脚本命令之grep

[ grep简介: ] grep是用来过滤含有特定字符的行 用法: grep 'pattern' file 例如: grep 'bbb' aaa.txt --color                     # 从文件aaa.txt中搜索关键词bbb, 并高亮显示. [ 正则元字符: ] grep可以结合正则表达式使用, 下面介绍一些常用的正则表达式过滤字符的用法. 1.  ^表示行开头 grep   '^bbb'   aaa.txt  --color                 # 从文

Sed简介 (转)

Sed简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有 改变,除非你使用重定向存储输出.Sed主要用来自动编辑一个或多个文件:简化对文件的反复操作:编写转换程序等.以下介绍的是Gnu版本的Sed 3.02. 2. 定址 可以通过定址来定位你所希望编辑的行,该地址用数字构成,用

sed 命令+正则表达式

sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文件.sed可以随意编辑小或大的文件,有许多 sed命令用来编辑.删除,并允许做这项工作时不在现场.sed一次性处理所有改变,因而变得很有效,对用户来说,最重要的是节省了时间.sed必须通过行号和正则表达式指定要改变的文本行 sed怎样读取数据: sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,

linux-shell脚本命令之awk

[ awk简介: ] awk可以从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出. [ awk工作流程: ] awk会把文件一行内容去到内存里, 然后对这行内容进行分段 ( 默认按空格或tab分割, $1, $2, $3... ). 再删了, 然后读取第二行内容到内存... 格式: awk '{/pattern/ command1; command2; ...}' file        # 匹配模式的这一行执行命令 例如: who | awk '{print $1}'

awk &nbsp; sed &nbsp; grep &nbsp; &nbsp; 正则表达式

做事要有耐心. 虚心接受建议,你确实有很多缺点. 就算进步慢,也不可以停止前进的脚步. AWK awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有三种不同版本: awk   gawk    nawk 1.使用方法 awk '{pattern + action}' {filenames} 其中 pattern 表示 AWK 在数

Shell脚本学习之sed详解

在编写shell脚本的过程中,我们经常需要使用sed流编辑器和awk对文本文件进行处理. 一.什么是sed? sed 是一种在线编辑器,它一次处理一行内容.sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. 二.sed的处理过程 sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上.sed每

LinuxShell脚本——选择结构

LinuxShell脚本——选择结构 摘要:本文主要学习了Shell脚本中的选择结构. if-else语句 基本语法 最简单的用法就是只使用if语句,它的语法格式为: 1 if 条件 2 then 3 命令 4 fi 如果将if和then写在一行,则需要在then前面添加“;”: 1 if 条件; then 2 命令 3 fi 如果有两个分支,就可以使用if-else语句,它的格式为: 1 if 条件 2 then 3 命令1 4 else 5 命令2 6 fi Shell支持任意数目的分支,当