मैं बैश में कई टेक्स्ट फ़ाइलों की शुरुआत और अंत में टेक्स्ट को कैसे जोड़ सकता हूं?


24

मेरे पास पाठ फ़ाइलों से भरा एक निर्देशिका है। मेरा लक्ष्य उन सभी की शुरुआत और अंत में पाठ को जोड़ना है। शुरुआत और अंत में जाने वाला पाठ प्रत्येक फ़ाइल के लिए समान है।

वेब से मुझे मिले कोड के आधार पर, यह फ़ाइल की शुरुआत में संलग्न करने के लिए कोड है:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

यह फ़ाइल के अंत में संलग्न होने का कोड है। लक्ष्य };प्रत्येक फ़ाइल के अंत में पाठ जोड़ना है :

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

मेरे द्वारा लिए गए उदाहरण व्यक्तिगत फाइलों पर अभिनय करने के लिए थे। मुझे लगा कि मैं वाइल्डकार्ड का उपयोग करके कई फाइलों पर अभिनय करने की कोशिश करूंगा *.txt

मैं अन्य गलतियाँ भी कर सकता हूँ। किसी भी स्थिति में, मैं कई फ़ाइलों की शुरुआत और अंत में पाठ को कैसे जोड़ सकता हूं?

जवाबों:


27

पाठ को उस फ़ाइल में प्रस्तुत करने के लिए जिसका आप उपयोग कर सकते हैं (GNU कार्यान्वयन के साथ sed):

sed -i '1i some string' file

पाठ को लागू करना उतना ही सरल है जितना कि

echo 'Some other string' >> file

आखिरी बात यह है कि इसे एक लूप में डालें जो उन सभी फाइलों पर निर्भर करता है जिन्हें आप संपादित करने का इरादा रखते हैं:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done

8

आप GNU sed का उपयोग कर सकते हैं

पहले से सचित्र की तरह, आप क्रमशः और कमांड sedका उपयोग करके किसी फ़ाइल की लाइनों के मिलान से ठीक पहले और बाद में पाठ की लाइनें सम्मिलित कर सकते हैं। जो नहीं दिखाया गया है वह यह है कि आप इसे एक-लाइनर के साथ और एक साथ कई फ़ाइलों के लिए कर सकते हैंia

निम्नलिखित पहली पंक्ति से पहले 1iऔर अंतिम पंक्ति के बाद एक पंक्ति सम्मिलित करेगा $a। ग्लोब से मेल खाती सभी फ़ाइलों के लिए सम्मिलन निष्पादित किया जाएगा *.txt

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

दोनों iऔर aन केवल लाइन नंबरों के साथ काम करते हैं, बल्कि हर उस रेखा पर भी जो किसी दिए गए पैटर्न से मेल खाती है। जब भी एक पंक्ति में कोई टिप्पणी सम्मिलित होगी var y = 2;:

sed -i -- '/var y = 2;/i//initialize variable y' *.js

5

पूरी तरह से POSIX आज्ञाकारी आदेश, का उपयोग कर ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

यदि आप printfकमांड के हिस्से को खुद से चलाते हैं , तो आपको सटीक संपादन कमांड दिखाई देंगे, जो कि निम्नलिखित हैं ex:

0a
var language = {
.
$a
};
.
x

0aका अर्थ है "पंक्ति 0 के बाद पाठ जोड़ें" (दूसरे शब्दों में, पहली पंक्ति से पहले)। अगली पंक्ति लाइन के बाद "एपेंड" करने के लिए शाब्दिक पाठ है। .एक लाइन पर अवधि ( ) अपने आप पाठ को जोड़ने के लिए समाप्त होती है।

$a फ़ाइल की अंतिम पंक्ति के बाद पाठ को जोड़ने का मतलब है।

x परिवर्तन और निकास से बचाने के लिए।


2

यहाँ यह पर्ल में करने का एक तरीका है:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done

@ -iइस फ़ाइल प्रतिस्थापन के बजाय स्टीफनचेज़लस जोड़ने से काम नहीं चलता है , यह सिर्फ स्टडआउट करने के लिए प्रिंट करता है।
ओलेह प्रिनपिन

@OlehPrypin, वास्तव में आपका अधिकार है। टिप्पणी हटा दी गई।
स्टीफन चेजलस

1

प्रयोग करके देखें ex:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

जहां आदेश हैं:

  • bufdo!प्रत्येक खोले गए बफ़र / फ़ाइल के लिए नीचे दिए गए आदेशों पर अमल करें (ध्यान दें: यह POSIX नहीं है )
  • 1s/^/HEAD/- HEADपंक्ति के आरंभ में पहली पंक्ति में पाठ सम्मिलित करता है
  • $s/$/TAIL/- TAILपंक्ति के अंत में अंतिम पंक्ति पर पाठ जोड़ता है

और तर्क हैं:

  • -s - साइलेंट / क्विक मोड
  • -cxa - सभी खोले गए बफ़र्स / फाइलों को सहेजें और छोड़ दें
  • *.foo- मौजूदा निर्देशिका में सभी फ़ाइलों ( *साथ) fooविस्तार, उपयोग **/*.foorecursivity के लिए (globstar सक्षम करने के बाद: shopt -s globstar)


1
@StevenPenny सही है। मैं POSIX निर्दिष्ट सुविधाओं का उपयोग केवल व्यक्तिगत रूप से स्क्रिप्टेड संपादन के लिए करता हूं
वाइल्डकार्ड

1

साथ gnu awk, का उपयोग करते हुए inplaceविस्तार और BEGINFILE/ ENDFILE:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt

1

साथ ही होने का अधिकार है ( .outफाइलों में परिणाम के साथ ):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

परिणाम के साथ प्रतिस्थापित एक और, अधिक विस्तृत संस्करण - स्रोत फ़ाइलें:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.