假设我想在 csh shell 中从字母 A 迭代到字母 Z。我该如何简洁地做到这一点?
在 bash 我会做类似的事情
for i in 'A B C ...Z'; do echo $i; done
关键是我不想写 A 到 Z,我想要类似的东西
[A-Z]
你能在 AWK 或 Perl 中提出一个单行建议吗?
perl -e 'print for "a" .. "z", "A" .. "Z", 0 .. 9'
Perl
$,=" ";print +(A..Z)
或在外壳内使用:
for i in `perl -e '$,=" ";print +(A..Z)'` ; do echo $i ; done
希望你已经安装了 Ruby。;) 从 shell 中看到这个简单的命令行:
使用 Ruby 从 A 迭代到 Z 并要求打印字母:
$ ruby -e ' "a".upto("z") {|letter| print letter}; print "\n"'
从 A 迭代到 Z 并将当前迭代期间获得的值替换为字符串,然后打印该字符串:
$ ruby -e ' "a".upto("z") {|letter| puts "mkdir #{letter}"}'
mkdir a mkdir b mkdir c mkdir d ... mkdir z
使用从 A 到 C 的迭代输出作为 的参数mkdir
,以创建 3 个目录:
$ mkdir $(ruby -e ' "a".upto("c") {|letter| puts "#{letter}"}')
做一个列表来查看结果:
$ ls -al drwxr-xr-x 2 iuliu 用户 4096 2009-10-07 00:09 a drwxr-xr-x 2 iuliu 用户 4096 2009-10-07 00:09 b drwxr-xr-x 2 iuliu 用户 4096 2009-10-07 00:09 c
希望这个对你有帮助!;)
问候, Iuliu
没有人有笨拙的解决方案,因此这是一个
awk 'BEGIN{for(i=65;i<=90;i++) printf "%c", i}'
怎么样:
for i in $(perl -e 'for my $i ("a".."z") { print "$i "; }'); do ...; done
...还是我误解了您要完成的工作?
(诚然,建议使用$,=" "
甚至比显式 Perlfor
循环更好)。但是,我不明白用+()
标点符号包装范围的价值。如果我只使用它对我有用:print A..Z;
... 虽然perl -we 'print a..z;' gives me a warning about unquoted strings, but the uppercase version doesn't. The statement
print +(a..z) gives exactly the same warning ... and quoting any of these eliminates the warning. So what's the intent of the
+(...)`? 它只是试图将其强制到列表上下文中吗?)
foreach i (`jot -c 26 65`)
echo $i
end
使用 AWK:
您可以使用以下链接参考 ASCII 字符集:
http://ee.hawaii.edu/~tep/EE160/Book/chap4/subsection2.1.1.1.html
现在要遍历任何一组值,您可以使用 AWK 命令,如下所示:
awk 'BEGIN{ for(i=97;i<123;i++){printf "%c ",i}; printf "\n";}'
结果:abcdefghijklmnopqrstu vwxyz
这里 97 对应于字母“a”,而 122 对应于“z”。您可以使用上面给出的列表中的任何值来改变结果。
等等。
我有完全相同的问题。显而易见的 Windows 用例是遍历驱动器号列表。这适用于 Cygwin:
for i in a b {d..z}; do (du -s "/cygdrive/$i;"); done
或者另一个例子:
for i in a b {d..h} {r..u}; do df /cygdrive/$i | grep -v Filesystem; done
或者另一个使用 Perl 的例子——感谢Jim Dennis的灵感:
perl -e 'for my $i ("a","b","d".."i","r".."v") { print "$i\n"; }' | sed -e 's/^/\/cygdrive\//'