विशिष्ट लाइन नंबर पर टेक्स्ट डालें


12

मैं एक बैश स्क्रिप्ट पर काम कर रहा हूं जो लाइन में डेटा के आधार पर एक टेक्स्ट डॉक्यूमेंट की सामग्री को विभाजित करेगा।

अगर मूल फ़ाइल की सामग्री साथ थी

01 line
01 line
02 line
02 line

मैं परिणाम के लिए बैश का उपयोग करके इस फ़ाइल की पंक्ति 3 में कैसे सम्मिलित कर सकता हूं

01 line
01 line
text to insert
02 line
02 line

मैं अपनी स्क्रिप्ट में एक हेरेडोक या कुछ इसी तरह का उपयोग करके ऐसा करने की उम्मीद कर रहा हूं

#!/bin/bash

vim -e -s ./file.txt <<- HEREDOC
    :3 | startinsert | "text to insert\n"
    :update
    :quit
HEREDOC

उपरोक्त पाठ्यक्रम का काम नहीं करता है, लेकिन कोई भी सिफारिशें जो मैं इस बैश स्क्रिप्ट में लागू कर सकता हूं?


जवाबों:


14

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -s -c '3i|hello world' -c x file.txt
  1. 3 पंक्ति 3 का चयन करें

  2. i टेक्स्ट और न्यूलाइन डालें

  3. x लिखो कि क्या परिवर्तन किए गए हैं (वे हैं) और बाहर निकलें

या मिलान स्ट्रिंग द्वारा:

ex -s -c '/hello/i|world' -c x file.txt

8

sed एक पारंपरिक विकल्प होगा (GNU सेड का शायद इससे आसान रूप है)।

$ cat input
01 line
01 line
02 line
02 line
$ sed '2a\
text to insert
' < input
01 line
01 line
text to insert
02 line
02 line
$ 

या, अत्यंत पारंपरिक होने के नाते, ed(बोनस! बिना लाइसेंस के sed -iफॉर्म में जगह संपादित करें )।

$ (echo 2; echo a; echo text to insert; echo .; echo wq) | ed input
32
01 line
47
$ cat input
01 line
01 line
text to insert
02 line
02 line
$ 

(इससे कोई लेना-देना नहीं है bash।)


2
जोड़ा बोनक्स echo text to insertद्वारा प्रतिस्थापितcat file-to-insert.txt
आर्चर

1
कम से कम बैश के साथ, उन सभी के बजाय echo, आप उपयोग कर सकते हैंprintf '%s\n' 2 a 'text to insert' . wq
evilsoup

6

कैसे कुछ के बारे में:

head -n 2 ./file.txt > newfile.txt
echo "text to insert" >> newfile.txt
tail -n +3 ./file.txt >> newfile.txt
mv newfile.txt file.txt

1
अजीब लेकिन दिलचस्प विचार +1
Tyþë-

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