shell复习笔记----查找与替换
查找文档
以grep 程序查找文本(匹配文本 matching text)相当方便.传统上有三种程序可以用来查找整个文本文件.
- grep 最早的文本匹配程序.其最简单的方式就是使用固定字符串
- $ who |grep -F austen //范例中使用- F 选项,以查找固定字符串 austen.
事实上,只要匹配的模式里未含有正则表达式的 meta 字符(metacharacter),则 grep 默认行为模式就等同于使用了-F.
- $ who |grep austen
- egrep 扩展式 grep.这个程序使用扩展正则表达式--这是一套功能更强大的正则表达式,使用它的代价是好屌更多的运算资源.
- fgrep 快速 grep(Fast grep).这个版本匹配固定字符串而非正则表达式,它使用优化的算法,能更有效匹配固定字符串.
- grep
- 语法:
- grep [ options ...] pattern - spec [ files ...]
- 用途:
- 现实匹配一个或者多个模式的文本行.时常会作为管道(pipeline)的第一步,以便于对匹配的数据做进一步处理.
- 主要选项:
- - E 使用扩展正则表达式进行匹配. grep -E可以取代传统的 egrep.
- - F 使用固定字符串进行匹配. frep -F可取代传统的 fgrep 命令
- - e pat-list 通常,第一个非选项的参数会指定要匹配的模式
- - f pat -file 从 pat -file 文件读取模式作匹配.
- - i 模式匹配时忽略大小写差异.
- - l 流出匹配模式的文件名称,而不是打印匹配的行.
- - q 静默地.摸过模式匹配成功则 grep 会成功地离开,而不将匹配的行写入标准输出;否则即使不成功.
- - s 不显示错误信息,通常与- q 并用.
- - v 显示不匹配模式的行
- 行为模式:
- 读取命令行上知名的每个文件.如果匹配查找模式的行时,将它显示出来.档知名多个文件时, grep 会在每一行前面加上文件名与一个冒号.默认使用 BRE.
- 警告:
- 你可以使用多个-d 与 -f 选项,建立要查找的模式列表.
正则表达式
正则表达式是一种表示方式,让你可以查找匹配特定准则的文本.此表示法让你可以写一个表达式,选定或匹配多个数据字符串.从根本上看,正则表达式是由两个基本组成部分所建立:一般字符与特殊字符.一般字符指的是任何没有特殊意义的字符;某些情况下,特殊字符也可以视为一般字符,特殊字符常称为元字符(metacharacter,简称 meta).
除了传统的 UNIX 正则表达式之外, POSIX 正则表达式还可以做到:
- 编写正则表达式,它表示特定于 locale 的字符序列顺序和等价字符
- 编写正则表达式,而不必关心系统底层的字符集是什么.
POSIX 的正则表达式有两种:基本正则表达式(BRE)以及扩展正则表达式(ERE).通常 ERE 比 BRE 功能更强大,不过不见得任何情况下都是这样.正则表达式对程序执行时的 locale 环境相当敏感;方括号表达式里的范围应避免使用,改用字符集,例如[[: alnum:]]较佳.另外许多 GNU 程序都有额外的 meta 字符.
字符 | BRE/ERE | 模式含义 |
\ | 两者都可 | 通常用以关闭后续字符的特殊意义.有时则是相反地打开后续字符的特殊意义,例如\(...\)与\{...\} |
. | 两者都可 | 匹配任何单个的字符,但 NUL 除外.独立程序也可以不允许匹配换行字符. |
* | 两者都可 | 匹配在他之前的任何数目(或没有)的单个字符.以 ERE 而言,此前置字符可以使正则表达式,例如:因为.(点号)表示任一字符,所以.*代表"匹配任意字符的任一长度".以 BRE 来说,*若至于正则表达式的第一个字符,不具任何特殊意义. |
^ | 两者都可 | 匹配紧接着的正则表达式,在行或字符串的起始处. BRE: 仅在正则表达式的开头处具有此特殊含义; ERE:至于任何位置都具特殊含义 |
$ | 两者都可 | 匹配前面的正则表达式,在字符串或行结尾处. BRE: 仅在正则表达式结尾处具特殊含义. ERE:至于任何位置都具有特殊含义. |
[...] | 两者都可 | 方括号表达式(bracket expression),匹配方括号内的任意字符.连字符(-)指的是连续字符的范围(注意:范围会因 locale 而有所不同,因此不具可移植性).^符号置于方括号里第一个字符则有反向含义:指的是匹配不在列表内(方括号内)的任何字符.作为首字母的一个连字符或是结束方括号(]),则被视为列表的一部分.所有其他的 meta 字符也列为列表的一部分(也就是:根据其字面上的意义).方括号表达式里可能会含有排序符号 |
\{n\m} | BRE | 区间表达式(interval expression),匹配在它前面的单个字符重现(occurrences)的次数区间. |
\( \) | BRE | 将\( 与\)间的模式存储在特殊的"保留空间(holding space)".最多可以将9个独立的子模式(subpattern)存储在单个模式中.匹配与子模式的文本,可通过转义序列\1至\9,被重复使用在相同模式里.例如:\( ab\).*1,指的是匹配与 ab 组合的两次重现,中建科存在任何数目的字符. |
\n | BRE | 重复在\(与\)方括号内第 n 个子模式至此点的模式. n 为1至9的数字,1为由左开始. |
{n,m} | ERE | 与先前提及的 BRE 的\{n\m}一样,只不过方括号前没有反斜杠. |
+ | ERE | 匹配前面正则表达式的零个或多个实例 |
? | ERE | 匹配前面正则表达式的零个或一个实例 |
| | ERE | 匹配于|符号前或后的正则表达式 |
() | ERE | 匹配于方括号括起来的正则表达式群. |
扩展正则表达式
正则表达式的扩展
程序与正则表达式
在文本文件里进行替换
很多 shell 脚本的工作都从通过 grep 或 egrep取出所需的文本开始.正则表达式最初结果,往往就成了要拿来做进一步处理的"原始数据(raw data)".通常文本替换(text substitution)至少需要做一件事,就是将一些字以另一些字代替,或者是删除匹配航的某个部分.
一般来说,执行文本替换的正确程序应该是 sed---流编辑器(Stream Editor).sed 的设计就是用来以批处理的方式而不是用交互的方式将来编辑文件. sed 存在的目的就在这里.虽然你也可以使用 ed 或者 ex 编辑脚本,但用他们处理会比较麻烦,通常用户不会记得要存储原来的文件.
sed 是处理简单字符串替换的主要工具,大部分的 Shell脚本在使用 sed 时几乎都是用来做替换的操作."从左边开始,扩展至最长(longest leftmost)"这个法则描述了匹配的文本在何处匹配以及匹配扩展到多长.
- sed
- 语法:
- sed [ -n ] 'edition command' [file ...]
- sed [ -n ] -e 'editing command'... [ file ...]
- sed [ -n ] -f script -file ... [file ...]
- 用途:
- 为了编辑它的输入流,将结果生成到标准输出,而非以交互式编辑器的方式拉编辑文件.虽然 sed 命令很多,能做很复杂的工作,但它常用的还是处理数据流的文本替换,通常作为管道的一部分.
- 主要选项:
- -e 'editing command'
- 将 editing command 使用在输入数据上.当有多个命令需应用时,就必须使用-e 了.
- -f script -file
- 自 script -file 中读取编辑命令.当有多个命令需要执行时,该选项相当有用.
- -n
- 不是每个最后已修改结果都正常打印,而是现实以 p 指定(处理过的)行.
- 行为模式:
- 读取每个输入文件的每一行,加入没有文件的话,则是标准输入.以每一行来说, sed 会执行每一个应用到输入航的 editing command.结果会写到标准输出(默认状态下,或是现实以 p 命令及-n 选项).若无-e 或- f 选项,则 sed 会把第一个参数看作是要使用的 editing command.
- find /home/tolstoy -type d -print | 寻找所有目录
- sed 's;/home/tolstoy/;/home/lt/;' | 修改名称:注意这里使用分号作为定界符
- sed 's/^/mkdir /' | 插入mkdir 命令
- sh -x 以 shell 跟踪模式执行
上述脚本是讲/ home/tolstoy 目录结构建立一份副本在/home/lt 下(可能是为备份而做的准备).
shell复习笔记----查找与替换的更多相关文章
- shell复习笔记----命令与参数
shell最基本的工作就是执行命令. 每键入一道命令, shell 就会执行. $cd work;ls -l whizprog.c 首先:格式很简单,以空白(Space 键或者 Tab键)隔开命令行中 ...
- shell复习笔记----用户管理
$ who 可以知道系统上有多少登陆 $who |wc -l 计算用户个数 注意:|是管道符号,可以在两个程序之间建立管道(pipeline):who 的输出,成了 wc 的输入, wc 所列出 ...
- shell复习笔记----入门知识
Unix 简史 UNIX 最初是由贝尔实验室(Bell Telephone Laborataries)的计算机科学研究中心开发的,第一版诞生于1970年--也就是在贝尔实验室退出Multics项目不久 ...
- linux shell 字符串操作(长度,查找,替换)详解
linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...
- Shell脚本学习指南 [ 第三、四章 ] 查找与替换、文本处理工具
摘要:第三章讨论的是编写Shell脚本时经常用到的两个基本操作.第四章总共介绍了约30种处理文本文件的好用工具. 第三章 查找与替换 概括:本章讨论的是编写Shell脚本时经常用到的两个基本操作:文本 ...
- shell的查找与替换
shell中做查找,grep是注定逃不开的. cat file | grep austin 就是在文档中查找Austin所在行. grep和正则表达式匹配之后,查找功能变得异常强大. 这个时候,要保证 ...
- Shell编程笔记
Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理. 修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...
- shell学习笔记
shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
随机推荐
- hihocoder 1043 完全背包
#1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...
- 浅谈MapControl控件和PageLayoutControl控件
1.MapControl控件是ArcObject(ArcEngine)中使用非常普遍的一个控件,它对应ArcMap中的DataView视图.MapControl控件实现的功能: 1)管理控件的外观.显 ...
- 自己改写的asp.net MVC EF Respoistory 仓储模式
之前改写网上收集的Respoistory 模式感觉很多地方都是不可取的,这里经过这段时间的充电重新改写一版,当然注释已加,还有不懂的,可以留言我. 首先还是拿出IRespoistory的接口层代码 u ...
- 前端开发中的一些chrome插件推荐
这篇博客推荐的都是谷歌chrome浏览器插件,理论上,与之相同内核的浏览器都能使用.由于是谷歌插件,所以在天朝的网络,你懂的! 红杏 专为 学者 .程序员.外贸工作者 打造的上网加速器.我们相信,上网 ...
- 使用Google Code和客户端TortoiseSVN 工具搭建一个在线源代码版本控制系统
把代码放在Google Code里,客户端还是使用TortoiseSVN ,就可以很方便地在家里和办公室协调工作了,不用再用U盘把代码拷来拷去了. 搭建过程: 1.注册一个google账户:https ...
- mvc Web api 如何在控制器中调用
关于如何调用 mvc Web api 的方法,网上一搜就是一大把,基本都是在前台jq中调用的,但是如何在后台调用呢? 本楼主做了一下测试,仅供参考. 先写一个简单的api,如下:[域1] namesp ...
- 第四篇、CocoaPods 镜像的更新 原来的淘宝镜像已经不再更新
在开发应用,我们常常使用cocoaPods来管理第三方框架,但是原来的淘宝的镜像不更新了 新的镜像地址:https://gems.ruby-china.org/
- CSS选择器介绍
一.元素选择器 E{...} 二.属性选择器 E[attr]{...}:指定该CSS对具有attr的元素起作用: E[attr=value]{...}::指定该CSS对具有attr的值为value的元 ...
- JavaScript---Cookie
用JavaScript创建.获取.删除Cookie的例子 1.创建cookie function setCookies(cName,cValue,exTimes){ var d = new Date( ...
- android 数据库的创建
主java package com.itheima.createdatabase; import android.app.Activity; import android.content.Contex ...