Joe*_*ley 9 shell bash bash-expansion
or例如,在读取文件时是否可以在 shell 中扩展选项。
我的意思是,例如,grep支持(A|B)在文件中匹配 A 或 B 之类的语法。
同样,如果我有这些文件:
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
Run Code Online (Sandbox Code Playgroud)
我能做到cat file{1..5}.txt的bash,因为它扩大了范围。是否有一种等效的方法可以仅对几个文件执行此操作?
例如cat file(1|5).txt,只打印那些 2?
Kus*_*nda 16
匹配数字的标准文件名通配模式是[0-9]. 这匹配一个数字:
cat file[0-9].txt
Run Code Online (Sandbox Code Playgroud)
只选择其中的两个:
cat file[25].txt
Run Code Online (Sandbox Code Playgroud)
对于大于 9 的数字,大括号扩展将很有用(但请参阅下面的注释以了解通配模式和大括号扩展之间的区别):
cat file{25..60}.txt
Run Code Online (Sandbox Code Playgroud)
同样,大括号扩展也允许单个数字:
cat file{12,45,900,xyz}.txt
Run Code Online (Sandbox Code Playgroud)
(请注意,在上面的示例中,大括号扩展不涉及算术循环,而只是根据提供的字符串生成名称)。
在 中bash,extglob启用 shell 选项 ( shopt -s extglob) 后,以下内容也将起作用:
cat file@(12|45|490|foo).txt
Run Code Online (Sandbox Code Playgroud)
该@(...)模式将匹配包含的任何一种以 -|分隔的模式。
匹配模式作为之间的差[...]和@(...)与支架扩展,是一个支架膨胀在命令行上产生和在当前目录中实际上可能不匹配任何现有名称。文件名通配模式将匹配名称,但如果并非所有可能的名称都存在,shell 不会抱怨。如果不存在匹配的名称,则模式将保持未扩展状态,除非还nullglob设置了shell 选项,在这种情况下模式将被删除。
例子:
touch file1
ls file[0-9]
Run Code Online (Sandbox Code Playgroud)
此处,仅显示 的文件列表file1。
随着ls file{0..9},ls会抱怨没有找到file0,file2等等。
在下面的示例中,第一个命令将只接触与给定模式匹配的现有名称,而第二行将创建尚不存在的文件:
touch file[0-9]
touch file{0..9}
Run Code Online (Sandbox Code Playgroud)
要使用的语法是file{1,2}which 将评估为file1和file2。
$ ls
$ touch file{1,2,3,4,5,6,7,8,9}
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9
Run Code Online (Sandbox Code Playgroud)
正如 Inian 在下面指出的那样......touch file{1..9}在这个例子中会更容易做到......
$ ls
$ touch file{1..9}
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9
Run Code Online (Sandbox Code Playgroud)
您还可以使用多个表达式,例如:
$ ls
$ touch file{1..9}{a..z}
$ ls
file1a file1b file1c
[...]
file9x file9y file9z
Run Code Online (Sandbox Code Playgroud)
是的,以上将创建 234(9次26)文件。
是的,您可以在bashshell 中使用大括号扩展。对于这几个文件,只是做file{1..2}或一样file{1,2}
或者如果您担心某些情况下文件不存在,只需做一个简单的循环,
for file in file{1..4}.txt; do
[ -f "$file" ] || continue
echo "$file" # Do other actions on file here
done
Run Code Online (Sandbox Code Playgroud)
或者,如果只是连接是您对文件的唯一操作,并且如果您不确定哪些文件在任何时间点都不能存在,则仅使用cat它们并抑制错误。/dev/null如果文件不可用,将标准错误重定向到将抑制错误。
cat file{1,5}.txt 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
或者使用 glob 表达式file[15],如果找不到文件,它不会抱怨错误。
cat file[15].txt
Run Code Online (Sandbox Code Playgroud)