linux c glob()函数详细的使用方法,将man glob 的英文翻译出来也行

linux c glob()函数详细的使用方法,将man glob 的英文翻译出来也行,第1张

GLOB

Section: Linux Programmer's Manual (7)

Updated: 12 June

1998

Index

NAME

glob - 形成路径名称

描述 (DESCRIPTION)

很久以前 在 UNIX V6 版 中 有一个 程序 /etc/glob 用来 展开 通配符模板.

不久以后 它 成为 shell 内建功能. 现在 人们 开发了 类似的 库函数 glob(3), 让 用户程序 实现 同样的 功能.

此 规则 遵循 (POSIX 1003.2, 3.13).

通配符匹配 (WILDCARD MATCHING)

包含 '?', '*' 或 '[' 字符的 字符串 称为 通配符模板(wildcard

pattern). 形成路径名(globbing) 指 一种 *** 作, 把 通配符模板 展开为 匹配 该串的 路径名. 匹配 定义为:

不在 方括弧中 的 '?' 匹配 任意 单个 字符.

不在 方括弧中 的 '*' 匹配 任意 字符串, 包括 空串.

字符集 (Character classes)

对于 表达式 `[...]', 如果 在 第一个 '['符 后面 出现的 第一个 字符 不是

'!', 则 该 表达式 匹配 任意 一个 在 `[...]'内 出现的 字符. 方括弧内 不能 有 空串, 因此 ']' 可以 作为 第一个 字符 出现在

方括弧内. (像 这样, '[][!]' 匹配 下列三个 字符 中的 任意 一个, '[', ']' 和 '!'.)

范围集 (Ranges)

字符集 有一个 特例: 用 '-' 分开的 两个 字符 表示 一个 范围集. (像 这样, `[A-Fa-f0-9]'

等于 `[ABCDEFabcdef0123456789]'.) 把 '-' 放到 方括弧内 的 开头 或 最后 可以 获得 它的 本意. (像 这样,

`[]-]' 匹配 ']'和'-' 中 任意 一个. 而 `[--/]' 匹配 `-', `.' 和`/'中任意 一个.)

补集 (Complementation)

表达式 '[!...]' 表示 一个 字符, 该 字符 不匹配 方括弧内 去掉 开头 '!' 后的

表达式. (像 这样, `[!]a-]' 匹配 除了 ']', 'a' 和 '-' 的 任意 一个 字符.)

要 去掉 '?', '*' 和 '[' 的 特殊 含义, 可以 通过 前面 加 一个 反斜杠或者 在 shell 命令行 中, 通过 引号 来 引用

这些 字符. 在 方括弧内 这些 字符 显露出 本意, 所以, '[[?*\]' 匹配 这 四个字符中 的 一个: '[', '?', '*', '\'.

路径名 (PATHNAME)

形成路径名 功能 应用于 路径 中 的 每一个 成员部分. 路径 中 的 '/' 不能 被通配符 '?' 或

'*', 或 范围集 如 '[.-0]' 匹配. 范围集 不能 直接 包含 '/', 否则 导致 语法错误.

如果 待匹配的 文件名 以'.'开头, 那么 这个 '.' 字符 必须 直接 给出. (比如说, 用 'tar c .' 会 更好.)

空列表 (EMPTY LISTS)

上述的 简单优雅 规则, 把 通配符模板 展开为 匹配的 路径名, 来源于 最初的 UNIX 定义. 它

允许 展开出 空串, 例如 xv -wait 0 *.gif *.jpg

这里 可能 没有 *.gif 文件 (而且 不算 错误).

然而, POSIX 要求 句法 错误 或 路径名 列表 为 空 时, 保留 通配符模板 不变. (译注: 即 不展开.)

在 bash 中 可以 通过 设置 allow_null_glob_expansion=true 把 它 强置为 传统的

风格. (其他 地方 也有 类似的 问题, 例如, 老式的 语句 是

rm `find . -name "*~"`

新的 写法 为

rm -f nosuchfile `find . -name "*~"`

以 避免 由于 空参数调用 rm 而 产生 错误信息.)

注意 (NOTES)

正规表达式 (Regular expressions)

注意, 通配符模板 不是 正规表达式, 尽管 它们 有点象. 首先, 它 匹配 文件名,

而 不是 正文其次, 规则 不一样, 例如 正规表达式 里 的 '*' 代表 零个或多个 前面内容的 重复.

正规表达式 的 方括弧表达式 用 '^' 引导 取反 *** 作, (而不是 '[!...]'). POSIX 声明, 在 通配符模板 中, '[^...]'

未做 定义.

字符集 和 国际化 (Character classes and Internationalization )

当然, 范围集 最初 指

ASCII的 范围, 因此 '[ -%]' 意思是 '[ !"#$%]',

一些 UNIX实现 把 这个 归纳为: 范围 X-Y 指 X的编码 到 Y的编码 之间的编码字符. 可是, 这 要求 用户 知道 他们 本地系统的

字符编码, 此外, 如果本地的 字母表顺序 和 字符集顺序 不对应, 那 就 更不方便了.

因此, POSIX 对 通配符模板 和 正规表达式 的 方括弧表达法 作了 重大扩展, 上面 我们 知道了 方括弧表达式 中 的 三个 类型, 它们是

(i) 取补集 (ii) 直接列出的 单个字符 和 (iii) 范围集.

POSIX 对 范围集 在 国际化 方面 作了 更有力的 说明, 并且 增加了 三个 类型:

(iii) 范围 X-Y 由 X 和 Y 之间 所有的字符 组成 (包括X和Y), X 和 Y 的 当前编码序列 由 当前场合的 LC_COLLATE

分类定义.

(iv) 命名字符集, 象

[:alnum:] [:alpha:] [:blank:] [:cntrl:]

[:digit:] [:graph:] [:lower:] [:print:]

[:punct:] [:space:] [:upper:] [:xdigit:]

因此 可以 用 '[[:lower:]]' 代替 '[a-z]', 它 在 丹麦语 里 同样 有效, 虽然 丹麦的 字母表 里 'z' 后面 还有

三个 字母. 这些 字符集 由 当前场合的 LC_CTYPE 分类定义.

(v) 符号对映, 象 '[.ch.]' 或 '[.a-acute.]', 在 '[.' 和 '.]' 之间的 字符串 是 定义 在 当前场合的

对映元素. 注意 这 可以 是 多字符元素.

(vi) 等类表达式, 象 '[=a=]', 在 '[=' 和 '=]' 之间的 字符串 是 任意 等类 中 的 对映元素, 它 定义在 当前场合.

例如, '[[=a=]]' 可以 等同于 `[a徉溻]' (警告: 这里 有 Latin-1 字符), 也就是

`[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]'.

SEE ALSO

sh(1), glob(3), fnmatch(3),

locale(7), regex(7)

#include<reg51.h>//sbit A=P2^0//sbit B=P2^1//sbit C=P2^2//sbit select=P2^3sbit clk=P3^0 //595串行时钟端sbit da=P3^1//595串行数据端sbit enable=P3^2/************************************字库**********************************************/unsigned char code stable[]={/*-- 文字: 天 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x40,0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x06,0x42,0x01,0xFE,0x02,0x42,0x04,0x42,0x08,0x42,0x10,0x42,0x30,0x42,0x60,0x42,0x20,0x40,0x00,0x00,/*-- 文字: 天 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x40,0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x06,0x42,0x01,0xFE,0x02,0x42,0x04,0x42,0x08,0x42,0x10,0x42,0x30,0x42,0x60,0x42,0x20,0x40,0x00,0x00,/*-- 文字: 快 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x70,0x00,0x00,0xFF,0xFF,0x00,0x08,0x80,0xB0,0x40,0x88,0x30,0x88,0x0E,0x88,0x01,0xFF,0x06,0x88,0x08,0x88,0x30,0x88,0x60,0xF8,0xC0,0x80,0x40,0x80,0x00,0x00,/*-- 文字: 乐 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x20,0x00,0x18,0x40,0x0C,0xFC,0x07,0x44,0x12,0x44,0x20,0x44,0x40,0x46,0x3F,0xFA,0x00,0x42,0x00,0x43,0x02,0x43,0x0C,0x42,0x38,0x40,0x10,0x00,0x00,0x00,/*-- 文字: ! --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0xDF,0xFC,0xDF,0xFC,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: 欢 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x14,0x10,0x24,0x4C,0x44,0x43,0x84,0x43,0x64,0x2C,0x1C,0x20,0x20,0x10,0x18,0x0C,0x0F,0x03,0xE8,0x06,0x08,0x18,0x08,0x30,0x28,0x60,0x18,0x20,0x08,0x00,0x00,/*-- 文字: 迎 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x40,0x20,0x41,0x1F,0xCE,0x20,0x04,0x40,0x00,0x47,0xFC,0x42,0x04,0x41,0x02,0x40,0x02,0x5F,0xFC,0x40,0x04,0x42,0x04,0x44,0x04,0x43,0xFC,0x40,0x00,0x00,0x00,/*-- 文字: 来 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x00,0x20,0x80,0x10,0x84,0x10,0x84,0x08,0x94,0x04,0xA4,0x02,0xC4,0xFF,0xFF,0x01,0x84,0x02,0xC4,0x04,0xB4,0x08,0x94,0x18,0x84,0x30,0x84,0x10,0x80,0x00,0x00,/*-- 文字: 我 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x04,0x20,0x04,0x20,0x42,0x22,0x82,0x22,0x7F,0xFE,0x01,0x21,0x01,0x21,0x10,0x20,0x10,0x20,0x08,0xFF,0x07,0x20,0x1A,0x22,0x21,0xAC,0x40,0x20,0xF0,0x20,0x00,0x00,/*-- 文字: 的 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x7F,0xF8,0x10,0x8C,0x10,0x8B,0x10,0x88,0x3F,0xF8,0x00,0x40,0x00,0x30,0x00,0x8F,0x03,0x08,0x26,0x08,0x40,0x08,0x20,0x08,0x1F,0xF8,0x00,0x00,0x00,0x00,/*-- 文字: 空 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x10,0x40,0x0C,0x40,0x84,0x41,0x44,0x41,0x24,0x41,0x14,0x41,0x05,0x7F,0x06,0x41,0x04,0x41,0x14,0x41,0x24,0x41,0x44,0x40,0x84,0x40,0x14,0x00,0x0C,0x00,0x00,/*-- 文字: 间 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFF,0xF8,0x00,0x01,0x00,0x06,0x00,0x00,0x07,0xF0,0x04,0x92,0x04,0x92,0x04,0x92,0x04,0x92,0x07,0xF2,0x40,0x02,0x80,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,/*-- 文字: 天 --*//*-- 宋体12 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x80,0x40,0x40,0x42,0x20,0x42,0x10,0x42,0x08,0x42,0x06,0x42,0x01,0xFE,0x02,0x42,0x04,0x42,0x08,0x42,0x10,0x42,0x30,0x42,0x60,0x42,0x20,0x40,0x00,0x00,}/*************************************************************************************** 行显示子程序 实质是给当前行中的所有列传送两字节的数据 ***************************************************************************************/void hang_disp(unsigned char temp1,unsigned char temp2){ unsigned char ifor(i=0i<16i++) { if(i==8)temp2=temp1 /***前8位即一字节传送完之后,传送该行的第二字节***/ if(temp2&0x01)da=1 /****数据从端口输出****/ else da=0 /****生成一上升沿,595上升沿接受数据****/ clk=0clk=1clk=0 temp2=temp2>>1} enable=0enable=1enable=0 /****595并行输出使能****/}/*************************************************************************************** 清行子程序 如果没有清行程序,该行显示完转到下一行时595的输出还没有变,还是上一行的数据 ,因为程序中是先选定行,再向595传数据的,所以下一行开始时有一段时间是显示合一行的内容的,这段时间就是向595传两个字节数据的时间。/***************************************************************************************/void hang_clear(){ unsigned char ifor(i=0i<16i++) { da=0/***595的输出连接的是点阵的阴极,所以让595输出高电平,可以使得该行的LED熄灭****/ clk=0clk=1clk=0} enable=0enable=1enable=0}/***************************************************************************************//***************************************************************************************/unsigned int count=0unsigned char move=0void disp(){ unsigned char iunsigned int jcount++for(i=0i<16i++) { P2=i /*****选定行*****/ //hang_disp(stable[2*(i+move)],stable[2*(i+move)+1]) /***从字库中取数据****/ hang_disp(~stable[2*(i+move)],~stable[2*(i+move)+1]) /***从字库中取数据再取反,能实现反显****/ for(j=0j<10j++) /***显示和清零间加以延时,以便显示明显,可以自行调节,也可以去掉***/ hang_clear() } if(count==10) /***调节移动的速度***/ {count=0 move++ if(move==192)/***调节移动的字数***n=move/16***/{ move=0 } } }/***************************************************************************************//***************************************************************************************/main(){ while(1){ disp() }}

首先我这边先建一个字母大小转换的脚本test2.sh,内容如下:先介绍些sed -n的应用:sed命令中p能实现打印匹配行的功能。我们可以实际看下sed命令带-n和不带-n情况下有什么不同。sed -n "1p" test2.sh:带-n选项的话,只打印test2.sh脚本第一行匹配行。sed "1p" test2.sh:不带-n的话,不仅打印第一行匹配行,还打印输出test2.sh脚本的全部内容。sed -n还可以打印文件的范围,比如打印test2.sh脚本的前两行,我们就可以执行以下命令:sed -n "1,2p" test2.sh,就可以直接打印前两行。sed命令可以打印匹配模式行,比如打印test2.sh脚本匹配tr的行,就可以执行以下命令:sed -n /tr/p test2.sh。remark:如果不带-n的话,除了打印匹配行外,还会打印脚本的全部内容。sed -e的应用。只有当sed命令传递多个编辑命令式,才会使用到-e。比如:我想打印/tr/匹配行,并且打印匹配行所在的行号,此时存在多个sed参数,就要用到-e了。sed -n -e /tr/p -e /tr/= test2.sh每个参数前都要带上-e:sed a\追加命令,命令格式为:sed ’指定地址a\追加内容‘ 目标文件这个追加内容在匹配行的下一行,只会输出到标准输出,原文件内容是不变的,例如在test2.sh脚本的/tr/所在的匹配行的下一行添加“#hello”内容,可需要执行:sed '/tr/a\#hello' test2.sh一定不要忘记单引号.还有一个sed i\的追加命令,命令格式为:sed ’指定地址i\追加内容‘ 目标文件,跟a\不同,i\追加是在指定位置的上一行追加命令sed命令中还有一些特殊的匹配,比如元字符匹配,此时需要用转义符"\"屏蔽其特殊意义。比如:sed -n ‘/\=/p’test2.sh,则打印输出tr一行。$在正则表达式中表示尾行,执行sed -n ‘$p’ test2.sh则打印脚本尾行。!表示取反,可以看以下两个例子sed中可以使用关键字来匹配行,打印我们所需要的内容,比如,我希望打印test2.sh第2,3行,可以执行:sed -n "2,3P" test2.sh,也可以执行sed -n "/tr/,/exit/p" test2.shsed c\的应用,命令格式为:sed ’指定地址c\替换内容‘ 目标文件。比如,#hello,替换test2.sh脚本的tr这行,可以执行命令:sed '/tr/c\#hello' test2.shsed删除d应用:比如我想删除test2.sh的第2行,可以执行以下命令:sed "2d" test2.sh或者sed /tr/d test2.shsed替换s应用:格式 sed s/被替换的字符/替换字符/[替换选项]比如,我想把test2.sh中tr替换成大写的tr,则可以执行以下命令:sed ‘s/tr/TR/’test2.sh,则把脚本中的tr替换成TR,完后输出全部内容。如果仅想打印替换所在行,则需要试用使用-n和-p:sed -n ‘s/tr/TR/p’ test2.sh:把脚本中的tr替换成TR,然后打印tr所在的行.如果脚本中存在好几个tr,并且每一行也存在多个tr,如果执行以上命令的话,只会更改每一行的第一个出现的tr,如果要全部把tr转后为TR,则需要添加G参数:sed -n ’S/tr/TR/pg’test2.sh。w参数是定向输入参数,比如要把上述的变更定向输出到test1.txt中,则需要执行:sed -n ’s/tr/TR/pgw test1.txt’ test2.sh。也可以直接把选定的匹配内容写到另一个文本中,比如想把test2.sh中tr这一样写到test2.txt中,执行:sed -n ’/tr/w test2.txt‘ test2.sh


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7284630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存