Linux sed 流编辑器的一些应用实例
1. 首先注意sed的作用是什么?本质是什么?本质就是自动的编辑器!也就是在脚本代码
中进行控制的!使编辑文件的过程自动化,以便用“批处理”方式编辑文件
2. sed是基于行的,因此按顺序对每一行执行命令。
3. 参数
sed: invalidoption -- h
用法: sed[选项]... {脚本(如果没有其他脚本)} [输入文件]...
-n, --quiet,--silent
取消自动打印模式空间
也就是所有的显示都是由自己控制的!!!
-e 脚本,--expression=脚本
添加“脚本”到程序的运行列表
-f 脚本文件,--file=脚本文件
添加“脚本文件”到程序的运行列表
-i[扩展名],--in-place[=扩展名]
直接修改文件(如果指定扩展名就备份文件)
-l N,--line-length=N
指定“l”命令的换行期望长度
--posix
关闭所有 GNU 扩展
-r,--regexp-extended
在脚本中使用扩展正则表达式
-s,--separate
将输入文件视为各个独立的文件而不是一个长的连续输入
-u,--unbuffered
从输入文件读取最少的数据,更频繁的刷新输出
--help 打印帮助并退出
--version 输出版本信息并退出
如果没有 -e,--expression, -f 或 --file 选项,那么第一个非选项参数被视为
sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
输入读取数据。
4. sed -e'1,10d' ping.sh >1
# 将ping.sh中逐行读取到缓冲区,删除ping.sh文件中1-10行,然后重定向到1文件中
5. sed -e'/^#/d' ping.sh > 1
#将ping.sh中逐行读取到缓冲区,删除ping.sh文件中第一个字符是#的行,然后重定向到
1文件中
6. sed -e'/"/d' ping.sh > 1
# 删除有 "的行,并输出到1文件
7. 字符 描述
^ 与行首匹配
$ 与行末尾匹配
\w 与任一个字符匹配
* 将与 前一个字符的零或多个出现匹配
[] 与 [ ] 之内的所有字符匹配
8. 下面是几个示例:
规则表达式 描述
/./ 将与包含至少一个字符的任何行匹配
---> 也就是说只要有一个字符的行都会输出
/../ 将与包含至少两个字符的任何行匹配
---> 也就是说只要有两个字符在一起及以上的都会删除
/^#/ 将与以 '#'开始的任何行匹配
---> 匹配开头( ^ ) 以#的行删除
/^$/ 将与所有空行匹配
---> 也就是开头结尾没有东西,所以就是空行删除
---> sed -e '/^$/d' ping.sh | wc -l >1 将非空行的函数输入到文件1( 删除空行,剩下
的结果输出到文件 )
/}$/ 将与以'}'(无空格)结束的任何行匹配
---> sed -e '/}$/d' ping.sh >1 以 }结束的行
/}*^/ 将与以 '}' 后面跟有零或多个空格结束的任何行匹配
/[abc]/ 将与包含小写'a'、'b' 或 'c'的任何行匹配
---> sed -e '/[a-z]/d' ping.sh >1 将有a-z字母的行都去掉
/^[abc]/ 将与以 'a'、'b'或 'c'开始的任何行匹配
---> sed -e '/[a-z]/d' ping.sh >1 将开头是a-z的行都删除
9. sed -n -e'/{/,/}/p' ping.sh >1
----> 注意这是输出命令(p),是输出{}之间的内容
请注意新的 '-n'选项,该选项告诉 sed 除非明确要求打印模式空间,否则不这样做。
您还会注意到,我们用'p' 命令替换了 'd' 命令,如您所猜想的那样,这明确要求 sed
打印模式空间。就这样,将只打印匹配部分。
10. sed -n -e'/judge[[:space:]]*(/, /^}/p' ping.sh>1
----> 输出judge函数的所有内容
11. 如何使用 sed来执行字符串替换、创建更大的 sed 脚本以及如何使用 sed 的附加、插
入和更改行命令。
12. 替换:
sed -e's/echo/oche/' ping.sh > 1
----> s前缀就是替换命令,就是将ping.sh中出现的echo替换为oche
----> 同时注意:只替换每行第一次出现的哦~
----> 请注意:这条命令没有改变源文件中的内容,而下面的就是可以的
sed -e's/echo/oche/g' ping.sh >1
----> 将所有的出现的都替换 ( 全局替换吧 )
我们需要知道的是,s/// 是一个命令哦,是不可分割的呗~所以我们可以与其他的命
令一起使用!
sed -e '1,10s/echo/ohce/g' ping.sh > 1
----> 也就是只处理1-10行( 包括1和10 )
注意:我们要知道的是:1和10指定的行结束,我们也可使用特殊的字符串结束!如
下:
sed -e '/^$/, /^}/s/echo/ohce/g' ping.sh > 1
----> 由空行开始执行,直到遇到 } 开始的行结束
注意:我们并没有硬性规定一定是s、/组合,这只是常规的用法,当然也可以使用别的
字符,例如
sed -e 's:echo:ooo:g' ping.sh >1 也是可以的哦~
但是一般在替换的字符串中有/才用这样的方法
例如:
sed -e 's:pt/ss.ps:pt/ss:g' ping.sh > 1
13. sed -e's/<.*>//g' ping.sh >1
---->将<>形式替换成空格!注意其中有一个 ' . ',所以最少是一个字符哦~
但是你自己运行一下,这是你需要的结果吗?!!!!
显然不是不是吗?
在我的测试代码中的内容是:
# pt/ss/ps <> <> <> <sdjsdvb> <...> <yyyy>
# <z>
那我本来想留下的结果是:
# pt/ss/ps
#
但是很不幸的是结果是:
# pt/ss/ps
这就是s///的处理机制不一样呗~!那么他会寻找最长的字符串,我们需要怎么作
呢!?
sed -e's/<[^>]*>//g' ping.sh > 1
中间是>的后面不处理
注意:有一些shell是不支持的!
14.
注意下面代码的不同:
对于处理这样一行:<yjasbhdcjsd> <a>
sed -e's/<[a-z]>//g' ping.sh>1 #注意此处只是匹配一个字符而已
和
sed -e's/<[a-z]*>//g' ping.sh>1 #此处匹配以字符开头的多个字符
15.
这将匹配零或多个全部为'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用
'[:space:]'字符类来匹配
空格。以下是可用字符类的相当完整的列表:
字符类 描述
[:alnum:] 字母数字 [a-zA-Z 0-9]
[:alpha:] 字母 [a-zA-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字[0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写[a-z]
[:print:] 非控制字符
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写[A-Z]
[:xdigit:] 十六进制数字 [0-9a-fA-F]
16. 高级替换功能
我们现在想在所有的行前面加上MM,那么怎么处理呢?是所有的行哦~
sed -e's/.*/MM: &/g' ping.sh >1
----> 就是 & 符号处理