2011-12-19 8 views
5

मैंएक निरपेक्ष पथ का उपयोग करने से निर्देशिका का नाम निकाला जा रहा है एसईडी या awk

/home/edwprod/abortive_visit/bin 

sed या awk स्क्रिप्ट का उपयोग करने के लिए इस लाइन

/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh 

विभाजित करना चाहते हैं? क्या आप इस पर मदद कर सकते हैं?

+0

संदर्भ क्या है? क्या यह एक फाइल में है? क्या आपके पास एक से अधिक घटनाएं हैं? क्या आप... ? – fge

+1

इसके लिए sed और awk overkill हैं, गोले के लिए इसके लिए उपयोगिताएं सीधे हैं। – Mat

+1

यदि आप बैश का उपयोग कर रहे हैं: क्यों 'dirname' कमांड का उपयोग न करें? – codeling

उत्तर

5

आदेश हो सकता है dirname क्या आप खोज रहे हैं?

dirname /home/edwprod/abortive_visit/bin/abortive_proc_call.ksh 

या आप एसईडी चाहते हैं, इसलिए यदि मेरे समाधान:

echo /home/edwprod/abortive_visit/bin/abortive_proc_call.ksh | sed 's/\(.*\)\/.*/\1/' 
+1

'sed'- आधारित समाधान में केवल आधार नाम वाले पथ के साथ समस्या है। उस मामले में 'dirname' रिटर्न' .'। –

11

dirname

kent$ dirname "/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh" 
/home/edwprod/abortive_visit/bin 

sed

kent$ echo "/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh"|sed 's#/[^/]*$##' 
/home/edwprod/abortive_visit/bin 

ग्रेप

kent$ echo "/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh"|grep -oP '^/.*(?=/)' 
/home/edwprod/abortive_visit/bin 

awk

kent$ echo "/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh"|awk -F'/[^/]*$' '{print $1}' 
/home/edwprod/abortive_visit/bin 
+1

'इननाम' के इन सभी विकल्पों में केवल बेसनाम युक्त पथों में समस्या है। उस मामले में 'dirname'' .' देता है। 'grep' संस्करण एक खाली स्ट्रिंग देता है और अन्य 'बेसनाम' के रूप में काम करता है –

1

awk + के लिए:

echo "/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh" | awk 'BEGIN{res=""; FS="/";}{ for(i=2;i<=NF-1;i++) res=(res"/"$i);} END{print res}' 
0

सबसे प्लेटफार्मों और यूनिक्स/लिनक्स गोले अब उपलब्ध dirname के लिए:

dirname /home/edwprod/abortive_visit/bin/abortive_proc_call.ksh 

dirname का उपयोग करना simpliest रास्ता है , लेकिन उदाहरण के लिए क्रॉस प्लेटफार्म स्क्रिप्टिंग के लिए इसकी अनुशंसा नहीं की जाती है autoconf का संस्करण http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/Limitations-of-Usual-Tools.html#Limitations-of-Usual-Tools का संस्करण।

तो dirname के लिए sed आधारित विकल्प के अपने पूर्ण विशेषताओं संस्करण:

str="/home/edwprod/abortive_visit/bin/abortive_proc_call.ksh" 
echo "$str" | sed -n -e '1p' | sed -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' - 

उदाहरण:

यह dirname तरह काम करता है:

  • /aa/bb/cc की तरह पथ इसे प्रिंट होगा /aa/bb
  • /aa/bb जैसे पथ के लिए यह /aa
  • /aa/bb/ जैसे पथ के लिए यह /aa प्रिंट करेगा।
  • /aa/ की तरह पथ के लिए यह /aa
  • प्रिंट होगा / की तरह पथ के लिए यह /
  • प्रिंट होगा aa की तरह पथ यह aa/ की तरह पथ के लिए .
  • प्रिंट होगा के लिए यह प्रिंट होगा .

यह है:

  • यह /
  • यह पथ aa और aa/
  • यह / के साथ शुरू रास्तों और पथ / के साथ ही सही काम करता है की तरह केवल आधार का नाम शामिल है कि के साथ सही काम करता है पूर्ण विराम वाले सही काम करता है।
  • यह किसी भी $str साथ सही काम करता है अगर यह अंत में \n शामिल है या नहीं, यहां तक ​​कि कई \n
  • साथ यह पार मंच sed आदेश का उपयोग करता
  • यह /
  • को / (/////) के सभी संयोजनों में परिवर्तन यह वर्तमान लोकेल के लिए अमान्य और अक्षरों वाले अक्षरों वाले पथों के साथ सही काम नहीं कर सकता है।

नोटbasename के लिए वैकल्पिक उपयोगी हो सकता है:

echo "$str" | awk -F"/" '{print $NF}' - 
0

awk साथ इस कोड dirname के रूप में पूरी तरह से के रूप में ही काम करेंगे, मुझे लगता है।

यह इतना आसान है और काम करने के लिए बहुत कम लागत है। सौभाग्य।

कोड

$ foo=/app/java/jdk1.7.0_71/bin/java 
$ echo "$foo" | awk -F "/?[^/]*/?$" ' 
{ print ($1 == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : $1); }' 

परिणाम

/app/java/jdk1.7.0_71/bin

टेस्ट

  • foo=/app/java/jdk1.7.0_71/bin/java ->/app/java/jdk1.7.0_71/bin
  • foo=/app/java/jdk1.7.0_71/bin/ ->/app/java/jdk1.7.0_71
  • foo=/app/java/jdk1.7.0_71/bin ->/app/java/jdk1.7.0_71
  • foo=/app/ ->/
  • foo=/app ->/
  • foo=fighters/ ->.

अधिक

आप उपलब्ध ऐसे awk सीमांकक नहीं कर रहे हैं, यह इस तरह का प्रयास करें।

$ echo $foo | awk '{ 
dirname = gensub("/?[^/]*/?$", "", "", $0); 
print (dirname == "" ? (substr($0, 1, 1) == "/" ? "/" : ".") : dirname); 
}' 
संबंधित मुद्दे