एक फ़ाइल के बजाय एक स्ट्रिंग चर पर sed का उपयोग करें


30

मुझे बताया गया है कि यह संभव था, लेकिन एक एकल कार्यशील उदाहरण के sedबिना, एक इनपुट फ़ाइल की आवश्यकता के बिना एक स्ट्रिंग चर से पढ़ा जा सकता है। मेरे पास इसे काम करने के लिए अभी तक नहीं है। सामान्य सुरक्षा के लिए, मैं $PATHचर को दूसरे चर में लिख रहा हूं , क्योंकि मैं इसके साथ गड़बड़ करता हूं, क्योंकि मुझे अन्य समस्याओं की आवश्यकता नहीं है जब तक कि मुझे पता नहीं है कि यह कैसे करना है।

निम्नलिखित को धयान मे रखते हुए:

~$x=$PATH
~$sed -i 's/:/ /g' $x

इसके साथ विफल रहता है: ऐसी कोई फ़ाइल या निर्देशिका नहीं।

यहाँ कुछ अन्य हैं जिन्हें मैंने आज़माया है:

~$ sed -i 's/:/ /g' | (read x) 
sed: no input files
~$ sed -i 's/:/ /g' | (read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x) 
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x 
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x) 
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x)) 
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x)) 
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x)) 
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' |  echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files

क्या यह भी काम कर सकता है? मैं उन फ़ाइलों को लिखने की ज़रूरत नहीं पसंद करूँगा जिन्हें मुझे ज़रूरत नहीं है इसलिए मैं sed का उपयोग कर सकता हूं। इस विशेष उदाहरण के लिए, अगर ~$x=$PATH ~$sed -i 's/:/ /g' $xवास्तव में जिस तरह से मैंने उम्मीद की थी, वह काम करेगा, तो मुझे मिलेगा:

/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games

जिसके बाद मैं एक चर को असाइन कर सकता हूं, और भविष्य के कमांड में उपयोग कर सकता हूं, जैसे ls $x


1
x=$(echo "$x" | sed 's/:/ /g')?
हेमेयेल

जवाबों:


16

शायद:

~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games

@jh --- ध्यान दें कि sedयहां "स्ट्रिंग चर" (?) पर काम नहीं किया जा रहा है, लेकिन मानक इनपुट पर --- यह कैसे होना चाहिए।
रमनो

मुझे लगता है कि बीमार sed
देवों के

4
@ j0h का इससे कोई लेना-देना नहीं है sed, यह एक सवाल है कि शेल कैसे इनपुट को पुनर्निर्देशित करता है। sedइनपुट धाराओं से संबंधित है और यह उनके मानक इनपुट के माध्यम से पढ़ता है। वे फाइलें हों या न हों, अप्रासंगिक हैं। जब तक यह मानक इनपुट के माध्यम से आता है, तब तक यह कुछ भी स्वीकार कर सकता है।
टेराडॉन

38

इसका इस तरह से कोई लेना-देना नहीं है sed, यह किसी भी प्रोग्राम पर लागू होता है जो मानक इनपुट को पढ़ता है। वैसे भी, आप जो देख रहे थे वह है

sed 's/:/ /g' <<<"$PATH"

किसी अन्य चर में सहेजने का कोई कारण नहीं है, आप इस तरह से कुछ भी नहीं करते हैं जो चर में संग्रहीत मूल्य को प्रभावित करेगा। उसके लिए आपको असाइनमेंट ऑपरेटर ( =) चाहिए। ऊपर उपयोग किए गए वाक्यविन्यास को "यहां स्ट्रिंग" कहा जाता है और यह बैश, ksh और zsh के लिए विशिष्ट है। यह एक चर के इनपुट को एक प्रोग्राम के इनपुट के रूप में पारित करने का कार्य करता है जो मानक इनपुट से पढ़ता है।

मैंने U & L पर एक उत्तर लिखा है जो इस तरह के सभी विभिन्न शेल ऑपरेटरों को सूचीबद्ध करता है। आप एक नज़र रखना चाह सकते हैं।

ध्यान दें कि आप भी कर सकते थे

echo "$PATH" | sed 's/:/ /g' 

अंत में, आपको वास्तव में इसके लिए बिल्कुल भी ज़रूरत नहीं है sed। आप पूरी बात सीधे मार सकते हैं:

echo "${PATH//:/ }"

ऊपर एक बैश रिप्लेसमेंट कंस्ट्रक्शन है। एक चर को देखते हुए $var, एक पैटर्न patऔर एक प्रतिस्थापन ( rep), की सभी घटनाओं को बदलने के लिए patके साथ rep, आप क्या करेंगे

echo "${var//pat/rep}"

एक ही स्लैश के साथ एक ही चीज केवल पहली घटना की जगह लेती है:

echo "${var/pat/rep}"

2
'बैश रिप्लेसमेंट कंस्ट्रक्शन' के लिए धन्यवाद। मैं बाद के मापदंडों में पहले तर्क को बदलने के लिए एक बैश फ़ंक्शन में "$ {1 / / से} तक" का उपयोग करने में सक्षम था।
AAAfarmclub
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.