abs 5.引用 - 通配符 word split Pathname Expansion

原创 2012年03月27日 15:39:06

[1]

除非正好当前工作目录下有一个名字为 first的文件. 然而这是引用的另一个原因. (感谢, Harald Koenig, 指出这一点.

测试如下:



-bash-3.00$ bash --version
GNU bash, version 3.00.16(1)-release (i386-pc-solaris2.10)
Copyright (C) 2004 Free Software Foundation, Inc.
-bash-3.00$ cat test.txt 
This is first line
This is First line?

-bash-3.00$ grep '[Ff]irst' *.txt
This is first line
This is First line?
-bash-3.00$ grep [Ff]irst *.txt    
This is first line
This is First line?
-bash-3.00$ 
-bash-3.00$ touch first
-bash-3.00$ grep '[Ff]irst' *.txt
This is first line
This is First line?
-bash-3.00$ grep [Ff]irst *.txt  
This is first line



资料总结:

After  word  splitting,  unless  the -f option has been set, bash scans

       each word for the characters *, ?, and [.  If one of  these  characters
       appears,  then  the word is regarded as a pattern, and replaced with an
       alphabetically sorted list of file names matching the pattern.   If  no
       matching  file  names  are found, and the shell option nullglob is dis-
       abled, the word is left unchanged.
  If the nullglob option is set,  and
       no  matches  are  found,  the  word  is removed.  If the failglob shell
       option is set, and no matches are found, an error  message  is  printed
       and  the  command  is  not executed.  If the shell option nocaseglob is
       enabled, the match is performed without regard to the  case  of  alpha-
       betic  characters.   When a pattern is used for pathname expansion, the
       character ‘‘.’’  at the start of a  name  or  immediately  following  a
       slash  must  be  matched explicitly, unless the shell option dotglob is
       set.  When matching a pathname, the  slash  character  must  always  be
       matched  explicitly.   In  other  cases,  the  ‘‘.’’   character is not

       treated specially.


看blackold的文章:
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3630808&highlight=
按照 bash 的命令处理流程,展开的先后顺序是:

brace expansion,
tilde expansion,
parameter、variable、arithmetic expansion 、command substitution
word splitting
pathname expansion


其中,pathname expansion 就是所谓的 wildcard。

至于什么是 wildcard, 资料文档很多,懒得说了。

那么 wildcard 发生在哪里?或者说命令行的哪部分进行了 pathname expansion (路径展开)?

bash 文档说,对所有字都进行 pathname expansion, 除非设置了 -f 选项。

这与网中人所说的:

http://bbs.chinaunix.net/viewthr ... ;page=16#pid2930144

首先, wildcard 也是屬於 command line 的處理工序, 作用於 argument 裡的 path 之上.
沒錯, 它不用在 command_name 也不用在 options 上.
了解了 wildcard 的擴展與重組特性後, 接下來, 讓我們了解一些常見的 wildcard 吧:
*: 匹配 0 或多個字元
?: 匹配任意單一字元

    {string1,string2,...}: 匹配 sring1 或 string2 (或更多)其一字串

    
是否有出入?

( 参考 gunguymadman 的贴子 http://bbs.chinaunix.net/thread-1608949-1-1.html )

很明显,{string1, string2, ...} 不是 wildcard, 而是 brace expansion,不说了。

看实验:
context:
  1. $ echo $BASH_VERSION
  2. 3.2.48(21)-release

  3. $ ls -1
  4. --file=ok.txt*
  5. --files.txt*
  6. -file.txt*
  7. -file=true.txt*
  8. file
  9. file2.txt
复制代码
options:
  1. $ echo -f*
  2. -file.txt -file=true.txt

  3. $ echo --file=*
  4. --file=ok.txt

  5. $ echo --f*
  6. --file=ok.txt --files.txt
复制代码
command:
  1. $ set -vx

  2. $ f* file
  3. f* file
  4. + file file2.txt file
  5. file2.txt: ASCII text
  6. file:      ASCII text

  7. $ set +vx
  8. set +vx
  9. + set +vx
复制代码
所以,应该避免这样的写法:
  1. grep -Eril --inlcude=*.c dir
复制代码
另外,bash 也说,在赋值的 value和 [[ ]]中不执行 pathname expansion,确实如此:
  1. $ a=f*

  2. $ echo "$a"
  3. f*
复制代码

bash之通配符

bash之通配符总结
  • astrotycoon
  • astrotycoon
  • 2016年03月06日 16:42
  • 2283

split使用总结,被坑的正则特殊符号:*/+

最近学习安卓的过程中,用到字符串分解,使用split,被zhengz
  • z745968621
  • z745968621
  • 2014年09月05日 10:18
  • 931

Word查找栏 代码·通配符一览表

Word查找栏代码·通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^...
  • GoodShot
  • GoodShot
  • 2013年02月28日 23:50
  • 13240

word通配符用原文替换原文加某以内容的方式

比如,我要把 A我们 A大的 A兔子 替换成为 A我B们 A大B的 A兔B子 该怎么使用通配符进行替换(即A后面的第一个字后再加上一个符号)...
  • GoodShot
  • GoodShot
  • 2014年05月22日 19:36
  • 2615

Parameter expansion

Introduction One core functionality of Bash is to manage parameters. A parameter is an entity tha...
  • CaspianSea
  • CaspianSea
  • 2015年09月01日 01:48
  • 692

Word文档用通配符批量替换日期格式

= =搬砖的过程中要做一件很痛苦的事情就是把word上的任务转到团队任务管理的软件上去..但是呢,其他职员在写文档的时候,日期用的格式很不统一,而且和乙方回复的文档日期格式也不一致,诸如 2017.X...
  • zhning12L
  • zhning12L
  • 2017年12月18日 13:05
  • 152

python学习笔记--代码

texts=[[word for word in document.lower().split() if word not in stoplist] for document in documents...
  • u012328476
  • u012328476
  • 2014年04月28日 10:46
  • 464

程序中出现unexpected end of file in macro expansion

这是在宏扩展的文件意外结束的意思,说的是你用宏时没有收尾: 例如 #define max(a,b) a>b?a:b 假如你用宏的时候你缺了右括号   如 max(3,5;  编译器就会报这种错,...
  • xexiyong
  • xexiyong
  • 2013年07月06日 10:02
  • 5553

Word查找的通配符和特殊字符!

通配符主要有: *代表0至任意个字符; ^?代表任意字符; ^#代表任意数字; ^$代表任意字母; ^&代表查找内容(在替换时使用)。 其他段落标记、人工换行符、制表符等等应该称为特殊字符...
  • kevinhg
  • kevinhg
  • 2012年04月05日 12:52
  • 8652

本周值得读:13 份最新开源「Paper + Code」

在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考。在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果。点击本文底部的「阅读原文」即刻加入社区,查...
  • c9Yv2cf9I06K2A9E
  • c9Yv2cf9I06K2A9E
  • 2018年01月19日 00:00
  • 96
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:abs 5.引用 - 通配符 word split Pathname Expansion
举报原因:
原因补充:

(最多只允许输入30个字)