टेक्स्ट फ़ाइल में कमांड के रूप में मैं एक विशिष्ट लाइन कैसे चला सकता हूं?


11

कभी-कभी मुझे एक कमांड को निष्पादित करने की आवश्यकता होती है जो शेल स्क्रिप्ट में होती है।

मुझे पहले से ही पता है sed -n 'line_num p'कि वह लाइन प्रिंट कर सकते हैं। लेकिन मैं एक कमांड के रूप में उस विशिष्ट लाइन को कैसे प्रिंट कर सकता हूं?

जवाबों:


9

इस आदमी की कोशिश करो =):

sed -n 'line_num p' | bash

या

"$(sed -n 'line_num p')"

@ माइकर्स मुझे अपनी शिक्षा के लिए उस कथन के संदर्भ को जानने में दिलचस्पी है।
ब्राचली

के बीच एक स्थान रखने की आवश्यकता नहीं है , line_numऔर pउदाहरण के लिए यदि line_num123 है, तो आप कर सकते हैं sed -n 123p | bash। और अगर shपर्याप्त है, तो shइसके बजाय बस का उपयोग करें bash
जनोस

तो, sed -n 'line_num p' | shएक और समाधान हो सकता है? क्या यह अधिक अनुकूलता है?
जेन

1
@ ज़ेन - यह इस बात पर निर्भर करता है कि स्क्रिप्ट के लिए कौन सा शेल लक्षित है। यह इस बात पर भी निर्भर करता है कि shवास्तव में शेल क्या है। डेबियन (और व्युत्पन्न) सिस्टम shपर आमतौर पर है dash। यदि स्क्रिप्ट के लिए लिखा गया है dash (या अन्यथा पोर्टेबल सिंटैक्स पर निर्भर करता है) तो शायद, हाँ, लेकिन अगर यह लिखा जाता है bashतो लगभग निश्चित रूप से नहीं।
मिकसेर्व

क्या यह इतिहास फ़ाइल के साथ किया जा सकता है ताकि अगर मैं चलाऊं historyऔर मैं देखूं कि मैं लाइन 900 को चलाना चाहता हूं, तो क्या मैं किसी तरह लाइन 900 चला सकता हूं?
codecowboy

3

यदि आप यह अंतःक्रियात्मक रूप से कर रहे हैं, तो आप लाइन को बैश इतिहास में लिख सकते हैं:

history -s "$(sed -n 'line_num p')"

फिर Enterलाइन को रीडलाइन बफर में सम्मिलित करने के लिए दबाएं , और इसे निष्पादित करें; इससे पहले कि आपको बहुत देर हो जाए लाइन में झांकने का मौका दें।


यह बहुत चालाक है, और शायद एक अच्छी धारणा है।
मिकसेर

इस -s विकल्प का यहाँ क्या मतलब है? मुझे स्पष्टीकरण नहीं मिल रहा हैman history
जेन

@zen: historyएक बिल्ट-इन है, इसलिए इसे help history(या man bash, लेकिन यह बहुत अधिक पढ़ने का) दस्तावेज है । उपरोक्त उद्धरण, history -s"एआरजी को इतिहास सूची में एकल प्रविष्टि के रूप में जोड़ देगा"
रिसी

2

तुम कर सकते हो...

{ head -n"$((NUM-1))"; IFS= read -r line; } </path/to/script >/dev/null
eval "$line"

वह $NUMशेल चर में आपकी स्क्रिप्ट से केवल पंक्ति प्राप्त करेगा $lineऔर फिर वर्तमान शेल में एक कमांड के रूप में इसका मूल्यांकन करेगा।

ऐसा करने का एक और तरीका इस तरह दिख सकता है:

 </path/to/script sed "${NUM}q;d" >/tmp/"$$"
 . /tmp/"$$" ; rm /tmp/"$$"

1
'बुराई' 'बुराई' की एक आम गलत वर्तनी है। यदि उत्तर का उत्तर है, तो निश्चित रूप से आप गलत प्रश्न पूछ रहे हैं। देखें mywiki.wooledge.org/BashFAQ/048
गाइल्स Quenot

1
हाँ। हर कोई प्यार करता है eval
मिकसेर

gnu sedहै eझंडा कुछ की तरह तो sed "${NUM}"'!d;s/^//e;q'भी काम होगा
don_crissti

2

क्या आप vim (vi on Linux) के साथ अपनी स्क्रिप्ट का संपादन कर रहे हैं? Vi में एक मानचित्रण जोड़ें:

:nmap <F4> Y:!<C-R>"<C-H><CR>

और बाद में जब आप vi प्रेस F4 में दिलचस्प लाइन पर हों


-2

बैश में आप निम्न कमांड चला सकते हैं:

for line in $(cat file.txt); do command $line; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.