`
su1216
  • 浏览: 671965 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:72007
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:128914
社区版块
存档分类
最新评论

《Unix & Linux 大学教程》 - 第十九章(二)、第二十章 学习笔记

阅读更多

学习笔记,内容基础,适合初学者。

 

阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)

《Unix & Linux 大学教程》 - 第一、二章 学习笔记    Unix简介 & 什么是Linux?什么是Unix

《Unix & Linux 大学教程》 - 第三、四章 学习笔记    Unix连接 & 开始使用Unix

《Unix & Linux 大学教程》 - 第五、六章 学习笔记    GUI:图形用户界面 & Unix工作环境

《Unix & Linux 大学教程》 - 第七、八章 学习笔记    Unix键盘使用 & 能够立即使用的程序

《Unix & Linux 大学教程》 - 第九、十章 学习笔记    文档资料:Unix手册与Info & 命令语法

《Unix & Linux 大学教程》 - 第十一、十二章 学习笔记    shell & 使用shell:变量和选项

《Unix & Linux 大学教程》 - 第十三章 学习笔记    使用shell:命令和定制

《Unix & Linux 大学教程》 - 第十四、十五章 学习笔记     使用shell:初始化文件

《Unix & Linux 大学教程》 - 第十八章 学习笔记    过滤器:统计和格式化
《Unix & Linux 大学教程》 - 第十九章(一) 学习笔记    过滤器:选取、排序、组合及变换
《Unix & Linux 大学教程》 - 第十九章(二)、第二十章 学习笔记  过滤器:选取、排序、组合及变换 正则表达式

《Unix & Linux 大学教程》 - 第二十一章 学习笔记  显示文件

《Unix & Linux 大学教程》 - 第二十二章(一) 学习笔记  vi文本编辑器(一)

《Unix & Linux 大学教程》 - 第二十二章(二) 学习笔记  vi文本编辑器 (二)

《Unix & Linux 大学教程》 - 第二十二章(三) 学习笔记  vi文本编辑器 (三)

《Unix & Linux 大学教程》 - 第二十四章 学习笔记  目录操作

《Unix & Linux 大学教程》 - 第二十五章 学习笔记  文件操作

《Unix & Linux 大学教程》 - 第二十六章(一) 学习笔记  进程和作业控制

《Unix & Linux 大学教程》 - 第二十六章(二) 学习笔记  进程和作业控制

《Unix & Linux 大学教程》 - 附录F 时区与24小时制时间



第十九章:过滤器:选取、排序、组合及变换

第十九章第二部分

 

基础知识

程序/命令

tr(translate,转换)

语法

tr [-cds] [set1 [set2]]

set1和set2为字符组

注意:不允许指定输入和输出文件,可以考虑使用重定向

 

tr a A < file(将file中的a替换为A)

tr abc ABC < file(将file中的a替换为A,b替换为B,c替换为C)

tr abcde ABC < file 等同于 tr abcde ABCCC < file

tr A-Z a-z < file (将大写转换为小写)

tr [:upper:] [:lower:] < file 等同于 tr A-Z a-z < file

tr [:digit:] A-J < file 等同于 tr 0-9 A-J < file

tr '\015' '\012' < file (其中的参数为ASCII的八进制数值,可以利用其替换不可见字符)

tr '\r' '\n' < file 等同于 tr '\015' '\012' < file

 

-s(squeeze,挤压):第一组中的多个连续字符应该替换为一个单独的字符

-d:删除指定的字符

-c(complement,补数):匹配所有不在第一组中的字符

 

tr 0-9 D < file(将0-9每一个数字都替换为一个字母D)

tr -s 0-9 D < file (将多个数字替换为一个字母D)

tr -d '()' < file (删除所有圆括号)

tr -d [:digit:] < file (删除所有数字)

tr -c ' \n' X < file (将空格和换行之外的所有字符替换为X)

 

题目:查看多个文本中出现过的单词数量(不计重复,不考虑大小写)

比如有两个文件

txt1内容为:

This is a test!

So you can ignore me.

 

txt2内容为:

Another file for test!

Hello world!

 

 

cat txt1 txt2 将两个文件合并

cat txt1 txt2 | tr 'A-Z ' 'a-z\n' 然后将空格替换为换行,大写变小写

cat txt1 txt2 | tr 'A-Z ' 'a-z\n' | tr -d ',.;:!' 然后去掉标点

cat txt1 txt2 | tr 'A-Z ' 'a-z\n' | tr -d ',.;:!' | sort -u 然后去掉重复,忽略大小写

cat txt1 txt2 | tr 'A-Z ' 'a-z\n' | tr -d ',.;:!' | sort -u | wc -l 最后统计行数,结果即为不重复单词的个数

 

上面的过程完成任务不够好,比如单词可以有撇号(o'clock)

所以要把所有非字母和撇号的字符替换为换行

cat txt1 txt2 | tr -cs A-Za-z\' '\n' | sort -fu | wc -l (sort也可以忽略大小写,这样就不用tr来做了)

书中答案

cat txt1 txt2 | tr -cs [:alpha:]\' "\n" | sort -fu | wc -l (貌似之前没有讲过[:alpha:]

 

 

sed(stream editor)

语法

sed [-icommand | -e command... [file]

command是sed命令

file是输入文件的名称

作用:简单替换文本

过程:

1.从输入流中读取一行

2.执行指定的命令,对该行进行必要的变换

3.将该行写入到输出流中

 

-i(in-place,原地):重定向到输入的文件中

(-i选择只在GNU版本的sed中可用)

sed 's/string/String/g' file > newfile (将单词string替换为String,然后将输出重定向到newfile中)

 

sed的命令s

语法

[/address|pattern/]s/search/replacement/[g] (其中g代表global)

address是输入流中一个或多个行的地址

pattern是一个字符串

search是正在表达式

replacement是替换文本

 

sed '2s/string/String/g' file (改变第二行的string为String)

sed '3,6s/string/String/g' file (改变第三至六行的string为String)

sed '1,$s/string/String/g' file (改变第一至最后一行的string为String)

sed '/OK/s/string/Stringg' file (改变含有OK字符串的行的string为String)

(关于正则的部分可参考下面第二十章的讲解,也可参考我之前介绍关于正则的文章:深入入门正则表达式

 

语法

sed -f instructions input

-f:标识命令程序文件

作用:运行存储在文件instructions中的sed程序,并使用文件input中的数据

 

-e(editing command,编辑命令):指定任意多个sed命令

sed -i \

-e 's/mon/Monday/g' \

-e 's/tue/Tuesday/g' \

-e 's/wed/Wednesday/g' \

-e 's/thu/Thursday/g' \

-e 's/fri/Friday/g' \

-e 's/sat/Saturday/g' \

-e 's/sun/Sunday/g' \

calendar

将calendar中的mon替换为Monday;tue替换为Tuesday……最后重定向到calendar本身(-i不是忽略大小写,见上文说明)

 

 

第二十章:正则表达式

我在我的博客已经有专门介绍正则表达式使用的文章了

下面的文章主要介绍的是java中的正则,这里只介绍与java正则不同的地方。

 

深入入门正则表达式(java) - 引言

深入入门正则表达式(java) - 1 - 入门基础 
深入入门正则表达式(java) - 2 - 基本实例

深入入门正则表达式(java) - 3 - 正则在java中的使用

深入入门正则表达式(java) - 匹配原理 - 1 - 引擎分类与普适原则

深入入门正则表达式(java) - 匹配原理 - 2 - 回溯

 

 

在java的正则中,我们使用\b作为单词分隔符,但是在这里,我需要使用\<和\>作为单词分隔符

在使用GNU实用工具的系统上(例如Linux和FreeBSD)可以使用\b

下面的预定义类在java中是没有的

含义 类似于
[:lower:] 小写字母 a-z
[:upper:] 大写字母 A-Z
[:alpha:] 大小写字母 a-zA-Z
[:alnum:] 大小写字母、数字 a-zA-Z0-9
[:digit:] 数字 0-9
[:punct:] 标点符号 -- 
[:blank:] 空格或制表符(空白符) --

 

Unix支持下面两种正则表达式

扩展正则表达式(extended regular expression,ERE)是现代版的正则表达式

基本正则表达式(basic regular expression,BRE)是一个以前的废弃版本正则表达式

下面是两种正则表达式的区别

扩展正则表达式 基本正则表达式 含义
{} \{\} 定义一个限定(花括号)
() \(\) 定义一个组(圆括号)
? \{0,1\} 匹配0次或1次

+

\{1,\} 匹配一次或多次
| -- 交变:匹配选项中的一个
[:name:] -- 预定义字符类

 

下面三条命令等价

grep -w 'cat' data

grep '\<cat\>' data

grep '\bcat\b' data

 

关于预定义字符类的使用

下面两条正则等价,查找非字母字符的行,最外层的括号并不作为字符组本身的一部分,所以使用预定义字符类的时候需要有两层方括号

grep '[^A-Za-z]' data

grep '[^[:alpha:]]' data

 

注意:字符组的使用需要注意locale的设置。检查环境变量是否LC_COLLATE=C,否则[a-z]和[A-Z]等结果可能不是你所期待的。

 

下面是书中三个问题,都很简单,这里直接给出问题和答案

1.查找字典文件中,以qu开头y结尾的单词(我机器的字典文件在/usr/share/dict下,words文件)

grep '^qu[a-z]*y' words

2.查找字典文件中,依次含有a、e、i、o、u

grep 'a[a-z]*e[a-z]*i[a-z]*o[a-z]*u' words

3.查找bin目录下两个字母长的命令

ls /bin | grep '^[a-z]\{2\}$'

ls /bin | egrep '^[a-z]{2}$'

 

关于正则的更多规则与技巧可以参考上面提到的我介绍正则的文章

 

名词解释

预定义字符类:字符集。比如[:digit:]、[:upper:]等



转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

2
6
分享到:
评论

相关推荐

    Linux学习笔记.pdf,linux详解,LINUX

    本资料“Linux学习笔记.pdf”将带你深入理解Linux的基础知识和高级应用。 一、Linux系统概述 1. Linux的起源:Linux的诞生源于托瓦兹对Minix系统的不满,他决定创建一个符合个人需求的、免费的Unix-like操作系统...

    linux学习笔记 .doc

    Linux学习笔记概述 Linux是一种自由和开放源代码的操作系统,其设计目标是提供一个轻量级、高效且安全的计算平台。Linux系统采用类UNIX目录结构,每个目录都有特定的功能和用途。以下是对Linux主要目录及其内容的...

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令大全 登陆服务器时输入 公帐号 openlab-open123 telnet 192.168.0.23 自己帐号 sd08077-you0 ftp工具 192.168.0.202 tools-toolss 老师测评网址 http://172.16.0.198:8080/poll/ 各个 ...

    linux系统学习笔记

    ### Linux系统学习笔记 #### 一、Linux系统Shell介绍 1. **Linux系统Shell类型**:Linux系统提供了多种Shell供用户选择,常见的包括Bourne shell (`sh`), C shell (`csh`), Korn shell (`ksh`)等。其中,`sh`是Unix...

    linux与unix经典编程

    - 第一部分的第二个至第十个字符分为三个三元组(triplet),分别表示文件属主、组用户和其他用户的权限。 - 第二部分表示文件的硬链接数目。 - 第三部分表示文件属主。 - 第四部分表示文件属主所在的默认组。 - 第...

    APUE读书笔记(Unix高级环境编程)

    #### 第二章 Unix标准化及实现 - **主要标准**:介绍POSIX标准、IEEE Std 1003.1以及其他相关标准。 - **主要Unix系统实现简介**:列举不同的Unix变种(如Solaris、AIX、HP-UX等),并简要说明其特点。 - **系统...

    第11章 Linux操作系统基础-教程与笔记习题

    以下是对"第11章 Linux操作系统基础"的主要知识点的详细阐述。 一、Linux操作系统简介 Linux是基于Unix的操作系统,由林纳斯·托瓦兹于1991年创建。它的内核是开源的,允许全球开发者对其进行修改和优化。Linux系统...

    嵌入式Linux入门笔记

    通过“嵌入式Linux入门笔记”,学习者将能了解嵌入式系统的基础概念,熟悉Linux内核、设备驱动、Bootloader的工作原理,掌握构建和调试嵌入式系统的技能,为成为一名合格的嵌入式Linux开发者打下坚实基础。

    循序渐进Linux.

    #### 第二章:Linux系统成长的故事 ##### 初识操作系统 - **定义**:操作系统是位于第三方应用程序与硬件之间的系统软件,用于管理和调度计算机资源。 - **功能**:管理CPU、内存、磁盘和网络等硬件资源,并为第三...

    Linux笔记[整理].pdf

    Linux操作系统是开源的类Unix系统,广泛应用于服务器、嵌入式设备和桌面环境中。了解Linux的基础知识,特别是其目录结构和命令行操作,对于软件开发人员来说至关重要。 首先,让我们来详细了解一下Linux的目录结构...

    总结搜集的shell脚本学习笔记(完结篇).pdf

    ### Shell脚本编程知识点概述 #### 一、预备知识与基本概念 在开始Shell脚本文档的学习之前,首先需要理解Shell...以上就是文档《总结搜集的shell脚本学习笔记(完结篇)》中所涵盖的主要知识点,希望对你有所帮助。

    Linux 101考试模块化培训笔记(Andrew McGill)Linux 101 Examination Modular Training Notes (Andrew McGill)

    Linux 101考试模块化培训笔记是为Linux专业人士协会(LPI)的LPI 101考试准备的,尤其针对考试的第2版目标。这本培训笔记由Andrew McGill编写,属于Leading Edge Business Solutions公司的Linux培训计划的一部分。该...

    C-plus-plus-Series:学习C ++的旅程

    C ++入门手册第五版笔记与知识点整合 一.C ++基础知识 二。函数 三。类 四.IO库 ##五。顺序容器 六。泛型编程 七。关联容器 八。动态内存 九。拷贝控制 十。重载运算与类型转换 十一。面向对象程序设计 十二。模板...

    大一大二mysql笔记

    2. 第二范式(2NF):非主键属性完全依赖于主键。 3. 第三范式(3NF):消除传递依赖。 七、数据库安全性 1. 用户权限管理:GRANT和REVOKE命令分配和撤销用户权限。 2. 视图(View):提供安全访问,只允许用户看到...

Global site tag (gtag.js) - Google Analytics