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ライクの場合:
echo $PATH | perl -F: -ane '{print join "\n", @F}'
任意のOS(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
パラメータ展開を使用します
awk:
echo $PATH|awk -F: '{gsub(/:/,"\n");print}'
パール:
echo $PATH|perl -F: -lane 'foreach(@F){print $_}'
これに使用する 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 -vFS=':' -vOFS='\n' '$1=$1'
あなたはできる:
echo $PATH | awk -vRS=':' '1'