6

假设我想在 csh shell 中从字母 A 迭代到字母 Z。我该如何简洁地做到这一点?

在 bash 我会做类似的事情

for i in 'A B C ...Z'; do echo $i; done

关键是我不想写 A 到 Z,我想要类似的东西

[A-Z]

你能在 AWK 或 Perl 中提出一个单行建议吗?

4

8 回答 8

7
perl -e 'print for "a" .. "z", "A" .. "Z", 0 .. 9'
于 2009-09-22T17:31:15.673 回答
5

Perl

$,=" ";print +(A..Z)

或在外壳内使用:

for i in `perl -e '$,=" ";print +(A..Z)'` ; do echo $i ; done
于 2009-09-22T17:33:38.007 回答
4

希望你已经安装了 Ruby。;) 从 shell 中看到这个简单的命令行:

  1. 使用 Ruby 从 A 迭代到 Z 并要求打印字母:

    $ ruby -e ' "a".upto("z") {|letter| print letter}; print "\n"'
    
  2. 从 A 迭代到 Z 并将当前迭代期间获得的值替换为字符串,然后打印该字符串:

    $ ruby -e ' "a".upto("z") {|letter| puts "mkdir #{letter}"}'
    
    mkdir a
    mkdir b
    mkdir c
    mkdir d
    ...
    mkdir z
    
  3. 使用从 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

于 2009-10-06T21:19:05.190 回答
1

没有人有笨拙的解决方案,因此这是一个

awk 'BEGIN{for(i=65;i<=90;i++) printf "%c", i}'
于 2009-11-28T06:46:10.413 回答
1

怎么样:

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 statementprint +(a..z) gives exactly the same warning ... and quoting any of these eliminates the warning. So what's the intent of the+(...)`? 它只是试图将其强制到列表上下文中吗?)

于 2009-09-23T10:06:42.860 回答
0
foreach i (`jot -c 26 65`)
    echo $i
end
于 2009-09-22T17:10:54.653 回答
0

使用 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”。您可以使用上面给出的列表中的任何值来改变结果。

  • 从 A 到 Z 65 到 90
  • 0 到 9 为 48 到 57
  • 从 a 到 z 为 97 到 122

等等。

于 2016-09-13T11:17:53.263 回答
0

我有完全相同的问题。显而易见的 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\//'
于 2020-08-06T00:28:58.550 回答