赞
踩
对以上的几个英语字符进行说明:
需要说明的是,使用时address和command会挨在一起,中间没有空格,上面语法中间加空格是为了说明这是两个部分
以下为sed命令的工作流程图:
选项
这里的选项就是指sed之后的options,常见的选项具体如下:
-e ,--expression=script
以选项中指定的script参数来处理文本文件,可以指定多个命令-f file,--files=script
以文件中的指定的参数来处理文本文件
-n ,--quiet ,--slient
取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-r ,--regexp-extended
支持扩展正则表达式
-i,--in-place[=SUFFIX]
直接修改文件内容
这里的地址就是语法格式中的address部分,是在单引号里的前一部分 。
替换标记说明
linenumber指定特定行号
startline,endline指定起始行号和结束行号
linenumber,+nn为数字,表示从指定行号向后n行
/pattern/已正则表达式表示的匹配模式
/pattern1, /pattern2/从模式匹配1到模式匹配2
/pattern/,x在给定行号上查询包含模式的行
x,/pattern/通过行号和模式查询匹配的行
x,y!查询不包含指定行号x和y的行
这里的指令就是command,这个一般放在单引号内,同时和要处理的字符放在一起,只是command放在字符的前面。
a 追加,向匹配行后面插入内容
i 插入,向匹配行前插入内容
c 更改,更改匹配行的内容
d 删除,删除匹配行的内容
s 使用替换模式替换相应模式
s/patten/newstring 替换,把patten匹配到的内容换成newstring
p 打印,打印出匹配的内容,通过与-n选项配合使用q 退出命令
= 标号,用来将匹配的行前标号
n 读取下一行,遇到n会自动自动跳入下一行
r 将内容读入文件
{} 命令间的传递,类似于管道符|
w 将匹配内容写入文件
W 将匹配到行的第一行,保存到file中。
正在匹配在上面已经介绍到,详情请见正则表达式介绍。具体见:Grep
以下主要针对地址指令的实战练习
先准备数据文件aa.txt,通过cat查看aa.txt文件内容
sed -n '2p' aa.txt
-n ,--quiet ,--slient
取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
2 linenumber指定特定行号
p 打印,打印出匹配的内容,通过与-n选项配合使用
sed '3,16d' aa.txt
sed '3,+13d' aa.txt
sed '/boot/d' aa.txt
sed '/^d/d' aa.txt
sed -n '/^d/,/^l/p' aa.txt
sed -n '/dev/,5p' aa.txt /pattern/,x在给定行号上查询包含模式的行
sed -n '2,/dev/p' aa.txt x,/pattern/通过行号和模式查询匹配的行x,y!查询不包含指定行号x和y的行
sed -n '3,16!p' aa.txt x,y!查询不包含指定行号x和y的行
以下主要正则正则匹配的实战练习:
先准备数据文件,通过cat命令查看java.conf文件
sed -n '/^#/!p' java.conf
sed -n '/^$/!p' java.conf 先通过^$取空,再取反
sed -n '/^#/!{/^$/!p}' java.conf {} 命令间的传递,类似于管道符|
sed -e '/^#/d' -e '/^$/d' java.conf
sed -n '/JVM_.*/p' java.conf
所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoo*b 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \,runo\*ob 匹配字符串 runo*ob。
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
sed -rn '/(JVM_ROOT|JNI_LIBDIR)/p' java.conf
-r ,--regexp-extended
支持扩展正则表达式
sed -n '/[[:digit:]]/p' java.conf
字符簇 | 描述 |
---|---|
[[:alpha:]] | 任何字母 |
[[:digit:]] | 任何数字 |
[[:alnum:]] | 任何字母和数字 |
[[:space:]] | 任何空白字符 |
[[:upper:]] | 任何大写字母 |
[[:lower:]] | 任何小写字母 |
[[:punct:]] | 任何标点符号 |
[[:xdigit:]] | 任何16进制的数字,相当于[0-9a-fA-F] |
以下主要针对各命令的练习,如s,i,a,r,w,p等
sed -n 's/a/b/p' info 替换匹配到的第一个 s/patten/newstring 替换,把patten匹配到的内容换成newstring
sed -n 's/a/b/pg' info g表示将匹配到的内容进行全局替换 。
sed '2,3s/root/test/g' aa.txt sed '2,$s/root/test/g' aa.txt $匹配输入字符串的结尾位置。
sed -n '/See/s/^/Hello/p' java.conf,为什么命令是这样,由于如果s放到前面,则直接进行进行替换了,因此先进行匹配,然后使用s对开头进行替换
sed -n '/See/s/See/& Hello/p' java.conf sed -n '/See/s/See/Hello &/p' java.conf &表示前面匹配到的内容
sed -n '/See/s/$/Hello/p' java.conf sed -n '/See/s/^/Hello/p' java.conf
sed '/aaa/i hello' info 插入,向匹配行前插入内容
sed '/aaa/a hello' info
sed '1a\hello' info
sed -n '/boot/=' aa.txt = 标号,用来将匹配的行前标号
以上所有的替换或变化都不会改变原文件的内容 。
sed -i 's/aaa/bbb/' info 向匹配行前插入内容,使用会更改原文件
sed -i '/tmp/s/root/test/g' aa.txt 除了/作为界定符,@,#也可以作为界定符
sed -i '/usr/s/$/ end/g' aa.txt
sed -i '3c\this is line' aa.txt
sed '1r aa.txt' info
sed '1,2w aa.txt' info
sed '/bbb/w aa.txt' info
sed -f a.sh file
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。