2012-10-23 40 views
7

Tôi đã đặt PATH của tôi trong một tệp văn bản và muốn in từng đường dẫn trên một dòng mới bằng cách sử dụng một lệnh đơn giản trong UNIX.

Tôi đã tìm thấy một chặng đường dài để làm điều đó mà đi như thế này ...

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

Tuy nhiên điều này dường như không hiệu quả vì vậy tôi biết có phải là một cách để nhanh chóng in ra kết quả của tôi trên một dòng khác nhau thời gian mà không phải tự gọi từng trường được phân tách bằng dấu phân tách.

+4

Các phân cách đường dẫn trên Unix là ruột ':' và không dấu chấm phẩy '; 'như quy định trong' lệnh awk' trong câu hỏi. –

Trả lời

16

Tuy nhiên, một cách khác:

echo $PATH | tr : '\n' 

hay:

tr : '\n' <Path.txt 
+0

Vì tôi đã ragging trên người khác cho bashisms, tôi cảm thấy như tôi phải chỉ ra rằng một số hệ thống tàu một 'tr' mà không hiểu' '\ n''. '' hoạt động, mặc dù. – zwol

+0

Trong trường hợp bất kỳ ai khác thắc mắc: mục PATH không được phép chứa dấu hai chấm. I E. không có cơ chế thoát: http://stackoverflow.com/a/29213487/1517969 – olejorgenb

0

Với Perl cho UNIX/UNIX-thích:

echo $PATH | perl -F: -ane '{print join "\n", @F}' 

Với bất kỳ hệ điều hành (thử nghiệm trên 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"; 

Nếu sử dụng cho Unix, hãy thử đoạn mã sau:

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

Sử dụng này bashparameter expansion

+0

Tính chất duy nhất của vỏ là tính di động cực đoan của nó. Nếu bạn không thể làm điều gì đó trong shell chỉ sử dụng các thiết bị tồn tại trong Unix98, bạn nên chuyển sang ngôn ngữ lập trình thực hơn là sử dụng các phần mở rộng shell không thể chuyển đổi. – zwol

+0

@Zack, nếu bạn cần tính di động, hãy ngừng sử dụng shell và thử dùng python, ruby ​​hoặc perl. –

+0

Nhưng đó chính xác là quan điểm của tôi! Thời điểm bạn cần một tính năng shell không thể chuyển đổi là thời điểm để ngừng sử dụng shell! – zwol

0

Tôi có một kịch bản Perl mà tôi sử dụng cho việc này:

#!/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"; 
    } 
} 

Tôi gọi nó thích:

echopath $PATH 
echopath PATH 
echopath LD_LIBRARY_PATH 
echopath CDPATH 
echopath MANPATH 
echopath $CLASSPATH 

v.v. Bạn có thể chỉ định tên biến hoặc giá trị của biến; nó hoạt động theo cả hai cách.

2

Giải pháp tr là một trong những quyền nhưng nếu bạn đang đi để sử dụng awk sau đó thì sẽ không có nhu cầu cho một vòng lặp:

$ 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 
+0

Chỉ cần đề cập đến gawk và mawk có nhị phân cửa sổ gốc, hoạt động tốt với cmd.exe, chúc mừng! – MeaCulpa

+0

OFS có ý nghĩa gì trong nhận xét trên? – Nick

+0

Đó là Dấu phân cách trường đầu ra. Tôi đang nói awk để có một lĩnh vực danh sách cách nhau bằng dấu hai chấm (FS = đầu vào trường tách) và in chúng cách nhau bởi newlines (OFS = đầu ra trường tách) để thay thế. –

0

awk:

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

perl:

echo $PATH|perl -F: -lane 'foreach(@F){print $_}' 
0

cho AWK, ngoài:

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

Bạn có thể:

echo $PATH | awk -vRS=':' '1' 
Các vấn đề liên quan