我已将我的 PATH 放在一个文本文件中,并希望在 UNIX 中使用一个简单的命令在换行符上打印每个路径。
我找到了很长的路要走,就像这样......
cat Path.txt | awk -F\; '{print $1"\n", $2"\n", ... }'
然而,这似乎效率低下,所以我知道必须有一种方法可以每次在新行上快速打印出我的结果,而不必手动调用由分隔符分隔的每个字段。
还有一种方式:
echo $PATH | tr : '\n'
或者:
tr : '\n' <Path.txt
tr 解决方案是正确的,但如果您要使用 awk 则不需要循环:
$ echo "$PATH"
/usr/local/bin:/usr/bin:/cygdrive/c/winnt/system32:/cygdrive/c/winnt
$ echo "$PATH" | awk -F: -v OFS="\n" '$1=$1'
/usr/local/bin
/usr/bin
/cygdrive/c/winnt/system32
/cygdrive/c/winnt
对于Perl
UNIX/UNIX-likes :
echo $PATH | perl -F: -ane '{print join "\n", @F}'
使用任何操作系统(在 Windows XP、Linux、Minix、Solaris 上测试):
my $sep;
my $path;
if ($^O =~ /^MS/) {
$sep = ";";
$path = "Path";
}
else {
$sep = ":";
$path = "PATH";
}
print join "\n", split $sep, $ENV{$path} . "\n";
如果在 Unix 上使用bash,请尝试以下代码:
printf '%s\n' ${PATH//:/ }
这个使用bash
参数扩展
我有一个用于此目的的 Perl 脚本:
#!/usr/bin/env perl
#
# "@(#)$Id: echopath.pl,v 1.8 2011/08/22 22:15:53 jleffler Exp $"
#
# Print the components of a PATH variable one per line.
# If there are no colons in the arguments, assume that they are
# the names of environment variables.
use strict;
use warnings;
@ARGV = $ENV{PATH} unless @ARGV;
foreach my $arg (@ARGV)
{
my $var = $arg;
$var = $ENV{$arg} if $arg =~ /^[A-Za-z_][A-Za-z_0-9]*$/;
$var = $arg unless $var;
my @lst = split /:/, $var;
foreach my $val (@lst)
{
print "$val\n";
}
}
我像这样调用它:
echopath $PATH
echopath PATH
echopath LD_LIBRARY_PATH
echopath CDPATH
echopath MANPATH
echopath $CLASSPATH
等你可以指定变量名,或者变量的值;它是双向的。
awk:
echo $PATH|awk -F: '{gsub(/:/,"\n");print}'
perl:
echo $PATH|perl -F: -lane 'foreach(@F){print $_}'
对于 AWK,除了:
echo $PATH | awk -vFS=':' -vOFS='\n' '$1=$1'
你可以:
echo $PATH | awk -vRS=':' '1'