// 最近在看这本书,这个笔记会选择的记录一些东西。:) // // /** * 正则表达式 */ BRE--Basic Regular Expressions----grep ERE--Extended Regular Expressions----egrep // 推荐用 grep -E 代替 egrep;grep -F 代替 fgrep // // BRG 正则的优先级, 由高到底 //---------------------------------------------------- [..] [==] [::] 用于字符排序的方括号符号 /metacharacter 转义的 meta 字符 [] 方括号表达式 /(/) /digit 子表达式于向后引用 * /{/} 前置单个字符重现的正则表达式 无符号(no symbol) 连续字符 ^ $ 锚点(Anchors) //---------------------------------------------------- //---------------// // ERG 正则的优先级, 由高到底 //---------------------------------------------------- [. .] [= =] [: :] 用于字符对应的方括号符号 /metacharacter 转移的 meta 字符 [] 方括号表达式 () 分组 * + ? {} 重复前置的表达式 无符号(no symbol) 连续字符 ^ $ 锚点(Anchors) | 交替(Alternation) //---------------------------------------------------- ^hello|world$ 匹配字符串的起始处有 hello 或 字符串的结尾处有 world ^(hello|world)$ 只匹配 hello 或者 world // // BRE 和 ERE 的一个区别: 在 ERE 中,运算符(* ? + {m,n})是被应用到“前置的正则表达式“,而不仅是前面单个字符。这是因为有((..))提供分组功能 例如:(why)+ 匹配于一个或连续出重复的多个 why -----摘抄自 info sed The only difference between basic and extended regular expressions is in the behavior of a few characters: `?', `+', parentheses, and braces (`{}'). While basic regular expressions require these to be escaped if you want them to behave as special characters, when using extended regular expressions you must escape them if you want them _to match a literal character_. -----说明 BRE ERE * * /+ + /? ? /{n,m/} {n,m} /( /) ( ) ----- //-- ((read|write)[[:space:]]*)+ 说明: * 表示匹配前面单个空格字符 0 次或多次 + 表示匹配前面括号表达式 1 次或多次,这个括号表达式是可以变化的(这个括号表达式可以匹配多中形式) 可以匹配 myhere readwriteread hello world 中的 readwriteread myhere read write read hello world 中的 read write read //-- //
// sed 替换 // /** * 一个要注意的地方:sed 只对匹配的部分作替换,其他部分原样返回。 */ //------ sed -e 's/^/([^:]*/):/([^,]*/)//1::::/2/' <<eof myhere:zhanglin,male,23 eof // 输出 myhere::::zhanglin,male,23 // 说明:/1 是 myhere, /2 是 zhanglin。只替换匹配的地方 // sed -e 's/^/([^:]*/):/([^,]*/)//' <<eof myhere:zhanglin,male,23 eof // 输出 ,male,23 // 说明:替换为空,没有匹配的部分原样返回。 //------ // /** * & 在替换文本里表示的意思是:从此点开始替代成匹配于正则表达式的整个文本 */ sed -e 's/zhanglin/&,male,23/' <<eof myhere:zhanglin,hello world eof // 输出:myhere:zhanglin,male,23,hello world
// shell 统计一篇文章中单词出现的频率 // //------------------------------- #! /bash/sh # 功能:统计一篇文章中每个单词出现的频率,按顺序输出 # 使用:path-to-directory [n] < file tr -cs a-zA-Z/' '/n' | tr A-Z a-z | sort | uniq -c | sort -k1,1nr -k2,2 | awk ${1:-25}q //-------------------------代码说明 1, tr 的 c 是取 set1 的补集(也就是不属于 set1),将 set1 的补集替换为 set2 s 是将 set1 中连续的要被替换的作为一个替换 /' 是因为有些单词是缩写可能用到 ' 2, 将大写字母转为小写 3, 排序 4, 统计每个单词重复出现的次数 5, 按单词出现的次数排序 n 将代排序字段按整数排序 r 反向排序(从大到小) 6, 输出 //-------------------------------
/** * awk */ awk 在 man 手册中有详细的介绍。 这里几下学习中遇到的问题。 // ** awk 中字符串是双引号括起的,单引号出错。 ** awk 中没有字符串连接运算符,两个连续字符串会自动连接在一起。 ** 正则有两种方式,/regexp/ 和 "regexp",如果要将正则保存在变量中,请使用 "regexp"( js 中正则直接用 /.../ 括起 ) --< BEGIN{ str = "hello, world"; regexp = "world"; if( str ~ regexp ){ print "success" }else{ print "failure" } } >-- ** awk 程序形式是 --< pattern {action} >-- pattern 和 action 不能同时省略,省略 action 为 print;省略 pattern 为 true 这个 组合 是针对每个文件的没一条记录执行一次,如果没有文件则不会执行。 --< awk -f file.awk # 只执行 BEGIN 和 END 中操作,因为没有记录。 >-- ** awk 在 pattern 中可以使用范围表达式,范围表达式以 逗号 隔开。 awk 从匹配于逗号左边的开始执行 action,到匹配右边的结束 --< FNR == 3, FNR == 10{ print; } # 输出文件中的 3 到 10 行 >-- >-- ** 写个完整的 awk 程序 --< BEGIN{ print "Program:" ARGV[0] " ARGC:" ARGC; print "arguments:"; for( k=1; k<ARGC; k++){ print "ARGV[" k "]: " ARGV[k]; } print "--------------"; } /world/ { print "--This line is matched--"; print FNR ":" $0; } END{ print "--------------"; print "NR: " NR } >-- --< # 语法: awk -f factorize.awk n # 功能:对整数 n 因数分解 BEGIN{ n = int( ARGV[1] ) m = n factors = "" for( k=2; m > 1 && k^2 <= n;){ # 必须为 <=; < 会出错 if( int(m % k) == 0){ factors = ( factors == "" ? "" : factors " * ") k m = m/k continue } k++ } if( m>1 && m<n){ factors = factors " * " m } print n, (factors=="") ? "is prime" : ( "= " factors) } >--