8

我已将我的 PATH 放在一个文本文件中,并希望在 UNIX 中使用一个简单的命令在换行符上打印每个路径。

我找到了很长的路要走,就像这样......

cat Path.txt | awk -F\; '{print $1"\n", $2"\n", ... }'

然而,这似乎效率低下,所以我知道必须有一种方法可以每次在新行上快速打印出我的结果,而不必手动调用由分隔符分隔的每个字段。

4

6 回答 6

17

还有一种方式:

echo $PATH | tr : '\n'

或者:

tr : '\n' <Path.txt
于 2012-10-23T23:45:18.523 回答
2

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
于 2012-10-24T03:26:40.553 回答
0

对于PerlUNIX/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 上使用,请尝试以下代码:

printf '%s\n' ${PATH//:/ }

这个使用bash 参数扩展

于 2012-10-23T23:43:42.813 回答
0

我有一个用于此目的的 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

等你可以指定变量名,或者变量的值;它是双向的。

于 2012-10-24T00:13:53.670 回答
0

awk:

echo $PATH|awk -F: '{gsub(/:/,"\n");print}'

perl:

echo $PATH|perl -F: -lane 'foreach(@F){print $_}'
于 2012-10-24T04:54:33.343 回答
0

对于 AWK,除了:

echo $PATH | awk -vFS=':' -vOFS='\n' '$1=$1'

你可以:

echo $PATH | awk -vRS=':' '1'
于 2012-10-24T05:00:08.480 回答