2012-10-23 13 views
7

का उपयोग करके $ PATH को पार्सिंग और प्रिंट करना मैंने अपने पैथ को टेक्स्ट फ़ाइल में रखा है और यूनिक्स में एक साधारण कमांड का उपयोग करके प्रत्येक पथ को एक नई लाइन पर प्रिंट करना चाहते हैं।यूनिक्स

मैं एक लंबा रास्ता इस प्रकार है कि यह करने के लिए मिल गया है ...

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

हालांकि यह अक्षम लगता है तो मैं जानता हूँ कि एक तरह से जल्दी से नई लाइनों प्रत्येक पर अपने परिणाम बाहर मुद्रित करने के लिए होना चाहिए डेलीमीटर द्वारा अलग किए गए प्रत्येक फ़ील्ड को मैन्युअल रूप से कॉल किए बिना समय। किसी भी OSes के साथ

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

(Windows XP, लिनक्स, Minix, सोलारिस पर परीक्षण):

+4

यूनिक्स पर पथ विभाजक पेट के 'है:' और नहीं सेमी-कोलन ';' प्रश्न में 'awk' आदेश में सेट के रूप में। –

उत्तर

16

फिर भी एक और तरीका है:

echo $PATH | tr : '\n' 

या:

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

चूंकि मैं अन्य लोगों पर bashisms के लिए ragging रहा है, मुझे लगता है कि मुझे यह इंगित करना है कि कुछ सिस्टम एक 'tr' जहाज है जो' \ n'' नहीं समझता है। '<हार्ड कैरिज रिटर्न>' काम करता है, यद्यपि। – zwol

+0

किसी और के आश्चर्य के मामले में: पथ प्रविष्टियों को कोलन रखने की अनुमति नहीं है। अर्थात। वहां कोई बचने की तंत्र नहीं है: http://stackoverflow.com/a/29213487/1517969 – olejorgenb

0
यूनिक्स/यूनिक्स-पसंद के लिए Perl साथ

my $sep; 
my $path; 

if ($^O =~ /^MS/) { 
    $sep = ";"; 
    $path = "Path"; 
} 
else { 
    $sep = ":"; 
    $path = "PATH"; 
} 

print join "\n", split $sep, $ENV{$path} . "\n"; 

यूनिक्स के लिए का उपयोग कर रहे हैं, तो कोशिश निम्नलिखित कोड:

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

इस प्रयोग bashparameter expansion

+0

खोल का एकमात्र गुण इसकी चरम पोर्टेबिलिटी है। यदि आप यूनिक्स 9 8 में मौजूद सुविधाओं का उपयोग करके खोल में कुछ नहीं कर सकते हैं, तो आप अयोग्य शैल एक्सटेंशन का उपयोग करने से वास्तविक प्रोग्रामिंग भाषा में स्विच करने से बेहतर हैं। – zwol

+0

@Zack, अगर आपको पोर्टेबिलिटी की आवश्यकता है, तो खोल का उपयोग करना बंद करें, और पायथन, रूबी या पर्ल की कोशिश करें। –

+0

लेकिन यह बिल्कुल मेरी बात है! जिस क्षण आपको एक अयोग्य खोल सुविधा की आवश्यकता है वह शैल का उपयोग बंद करने का क्षण है! – zwol

0

मैं एक पर्ल स्क्रिप्ट है कि मैं इस के लिए उपयोग किया है:

#!/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 

आदि। आप चर नाम या चर के मान निर्दिष्ट कर सकते हैं; यह दोनों तरीकों से काम करता है।

2

टीआर समाधान सही एक है, लेकिन यदि आप 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 
+0

जॉक और माक का जिक्र करने के लिए मूल विंडोज बाइनरी है, cmd.exe, चीयर्स के साथ अच्छी तरह से काम करें! – MeaCulpa

+0

उपर्युक्त टिप्पणी में ओएफएस का क्या अर्थ है? – Nick

+0

यह आउटपुट फील्ड सेपरेटर है। मैं कॉलन (एफएस = इनपुट फील्ड सेपरेटर) से अलग सूची फ़ील्ड लेने के लिए अजीब कह रहा हूं और उन्हें इसके बजाय न्यूलाइन (ओएफएस = आउटपुट फील्ड सेपरेटर) द्वारा अलग प्रिंट करें। –

0

awk:

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

पर्ल:

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

एडब्ल्यूके के लिए,

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

आप कर सकते हैं:

echo $PATH | awk -vRS=':' '1'