`Sed` और एक फ़ाइल के लिए यहाँ-डॉक्टर का उपयोग करना


10

मैं sed कमांड के लिए यहाँ-डॉक्टर का उपयोग करना चाहता हूँ और फ़ाइल को पढ़ने के लिए और आउटपुट फ़ाइल प्रदान करता हूँ।

मैंने यहाँ एडवांस बैश स्क्रिप्टिंग गाइड से डॉक्यूमेंट्स को देखा है, लेकिन यहाँ डॉक का उपयोग करने में नियमित तर्कों के बारे में कुछ भी उल्लेख नहीं किया गया है। क्या यह भी संभव है?

मैं निम्नलिखित की तरह कुछ हासिल करना चाहता हूं:

#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt

sed $IN << SED_SCRIPT
    s/a/1/g
    s/test/full/g

SED_SCRIPT 
> $OUT;

कोई भी मदद सचमुच सराहनीय होगी।

जवाबों:


14

आप GNU सेड को स्क्रिप्ट को मानक इनपुट से पढ़ने के लिए कह सकते हैं -f -, -fमतलब किसी फाइल से स्क्रिप्ट पढ़ने के लिए, और -मानक इनपुट बहुत सारे कमांड के साथ आम है।

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT

POSIX sed भी समर्थन करता है -f, लेकिन -मानक इनपुट के लिए उपयोग को प्रलेखित नहीं किया गया है। इस स्थिति में, आप /dev/stdinलिनक्स सिस्टम पर उपयोग कर सकते हैं (और मुझे याद है कि सोलारिस के पास भी यही है, लेकिन मैं अभी इसकी पुष्टि नहीं कर सकता)

उपयोग <<-SED_SCRIPT('-' उपसर्ग के साथ) समापन SED_SCRIPTटैग को इंडेंट करने की अनुमति देगा ।


धन्यवाद, आपने जो काम किया था, मैं कभी भी यह बताना चाहूंगा कि समापन टोकन को इंडेंट नहीं किया जा सकता है, अन्यथा यह बैश में एक त्रुटि का कारण बनता है, मुझे लगता है कि यह इसलिए है क्योंकि इसमें क्लोजिंग में व्हाइट-स्पेस भी शामिल है।
ट्रिस्टियन

ध्यान दें कि Apple OS X sed मानक इनपुट से स्क्रिप्ट पढ़ने का समर्थन नहीं करता है। (कम से कम उस तरीके से या किसी अन्य प्रलेखित तरीके से नहीं।)
डैनॉर्टन २४'१३

@danorton: मैंने एक समाधान जोड़ा है जिसमें समर्थन की आवश्यकता नहीं है -f -, sedलेकिन इसके लिए प्रक्रिया प्रतिस्थापन की आवश्यकता है <( command ):।
पाब्लोक

5

मामले में sedसे एक स्क्रिप्ट के पढ़ने का समर्थन नहीं करता stdin(का उपयोग करते हुए -f -), तो आप उपयोग कर सकते हैं प्रक्रिया प्रतिस्थापन (उपलब्ध में bash, zsh, ksh93):

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)

समापन कोष्ठक )को अंतिम सीमांकक ( SEC_SCRIPT) को तुरंत या एक नई सीमा के बाद पालन ​​करना चाहिए । प्रक्रिया प्रतिस्थापन के मामले में आप echoयहाँ एक दस्तावेज़ के बजाय भी उपयोग कर सकते हैं :

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )

1
मैक ओएस एक्स पर, यह तुरंत इनपुट फ़ाइल को पसंद नहीं आया ( "$IN"या यहां तक ​​कि testfile.txt) सेड कमांड के तुरंत बाद ही - यह एक -e scriptया चाहता था -f file। @Pabouk के उत्तर को फिर से व्यवस्थित करना मेरे लिए काम कर गया:sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
स्टीफन पी।

मैक्स ओएसएक्स पर बैश 4.2.45 और मानक बीएसडी सेड के साथ, समापन के नीचे कोष्ठक को एक नई रेखा पर होना था SED_SCRIPT
अलेक्जेंडर क्लिमेत्स्क 20

-1

शायद एक अच्छा दृष्टिकोण:

OUT=/dev/stdout

IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT < $IN

IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT <<< $IN

:)


1
दिलचस्प है, लेकिन बिंदु के अलावा। ओपी स्टड के जरिए सेड कमांड को पास करना चाहता है।
मूरू

यह दृष्टिकोण दोनों तरीकों की अनुमति देता है, डाउनवोट क्यों?
मैग्नस

दोहराएँ: "स्टड के माध्यम से sed कमांड पास करें"। आप जवाब किसी भी विधि से ऐसा नहीं करते।
मूरू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.