我知道正则表达式和通配符一般如何工作,但我真的不明白为什么你可以将它们用作参数。
ls /[!\(][!\(][!\(]/
命令导致以下输出
...
com.apple.launchd.AIPZ6SAfpO
com.apple.launchd.HarlOx3LWS
com.apple.launchd.VmTi5KDz1h
powerlog
/usr/:
X11 include libexec sbin standalone
bin lib local share
/var/:
agentx empty log netboot rwho
at folders ma networkd spool
audit install mail root tmp
backups jabberd msgs rpc vm
db lib mysql run yp
根据我的理解,这应该匹配不包含斜杠/[!\(][!\(][!\(]/
但为什么我可以将它用作参数?
答案 0 :(得分:2)
您不能将正则表达式用作参数(或者更确切地说,当放置在参数中时,shell不会将字符串视为正则表达式)。 unquoted glob /[!\(][!\(][!\(]/
按顺序匹配:
换句话说,三个字母的根目录在任何地方都不包含(
。
shell 将 globs扩展为零(例如,在Bash的nullglob的情况下)或更多可传递给execve
的参数,如以下命令所示:
$ strace -fe execve echo *
execve("/usr/bin/echo", ["echo", "directory1", "directory2"], 0x7ffcff705ce8 /* 44 vars */) = 0
答案 1 :(得分:0)
不,你不知道......在for (var k = 0; k < data1.queryA.length; k++) {
data.addColumn('number', data1.queryA[k].keyword);
}
for (var i = 0; i < data1.query.length; i++) {
var arr = [];
alert(data1.query[i].date.length);
for (var j = 0; j < data1.query[i].date.length; j++) {
arr.push(parseInt(data1.query[i].date[j].page));
}
var test = [new Date(data1.query[i].datee)];
console.log(test.concat(arr));
data.addRow(test.concat(arr));
}
中描述了shell模式,而glob(3)
中描述了正则表达式(更详细的概念)用于类似目的的两个不同的库。在替换参数时,regex(3)
不使用正则表达式。它只使用sh(1)
库。
答案 2 :(得分:-1)
因为那是shell的工作方式。包含(未引用的)glob字符/表达式的任何参数都将扩展为文件名。发生了什么,比如rm *.txt
(因为*
是一个水球角色),ls /[!\(][!\(][!\(]/
中发生了什么(因为[abc]
是一个glob表达式。)