विशिष्ट लाइन नंबर पर sed या awk के साथ एक लाइन डालें


146

मेरे पास एक स्क्रिप्ट फ़ाइल है जिसे मुझे 8 वीं पंक्ति में पाठ सम्मिलित करने के लिए किसी अन्य स्क्रिप्ट के साथ संशोधित करने की आवश्यकता है।

डालने के लिए स्ट्रिंग: Project_Name=sowstestनामक फ़ाइल में start

मैंने awk और sed का उपयोग करने की कोशिश की, लेकिन मेरी कमांड खराब हो रही है।

जवाबों:


231
sed -i '8i8 This is Line 8' FILE

8 पंक्ति में आवेषण

8 This is Line 8

फ़ाइल फ़ाइल में

-i FILE फाइल करने के लिए सीधे संशोधन करता है, stdout में कोई आउटपुट नहीं है, जैसा कि ग्लेन जैकमैन द्वारा टिप्पणियों में बताया गया है।


3
हां, -i स्विच जीएनयू-सेड के लिए विशिष्ट है।
उपयोगकर्ता अज्ञात

1
नहीं -आई का अर्थ है "निर्दिष्ट फ़ाइल को जगह में बदलना"। इन्स-स्विच से स्वतंत्र '8isomething' बनाम '8asomething' के साथ इन्सर्ट बनाम अपेंडेंस हासिल किया जाता है।
उपयोगकर्ता अज्ञात

11
मैक उपयोगकर्ताओं: homebrew के साथ, brew install gnu-sedऔर फिर इसके साथgsed
17

4
यह सुपर उपयोगी है! क्या मेरे लिए वैसे भी लाइन की शुरुआत में स्थान सम्मिलित करना है? मैंने देखा कि sed प्रारंभिक
व्हाट्सएप पर

9
@elju: हाँ, इसे बैकस्लैश के साथ मास्क करें sed '8i\ 8 This is Line 8' FILE:।
उपयोगकर्ता अज्ञात

32

एक edजवाब

ed file << END
8i
Project_Name=sowstest
.
w
q
END

.अपनी स्वयं की लाइन पर इनपुट मोड समाप्त होता है; wलिखते हैं; qइस्तीफा। GNU एड wqको बचाने और छोड़ने की आज्ञा है, लेकिन पुराने एड की नहीं है।

आगे पढ़े: https://gnu.org/software/ed/manual/ed_manual.html


19

OS X / macOS / फ्रीबीएसडी sed

-iझंडा MacOS पर अलग काम करती है sedजीएनयू की तुलना में sed

यहाँ MacOS / OS X पर इसका उपयोग करने का तरीका दिया गया है:

sed -i '' '8i\
8 This is Line 8' FILE

man 1 sedअधिक जानकारी के लिए देखें ।


18

अजीब जवाब

awk -v n=8 -v s="Project_Name=sowstest" 'NR == n {print s} {print}' file > file.new

@ हेगले जैकमैन मुझे #define SERVER@"http://10.35.42.54/ms0.8"एक विशेष पंक्ति में प्रवेश करने की आवश्यकता है । इसे कैसे प्राप्त किया जा सकता है?
नेविन राज विक्टर

1
मुझे लगता है कि
नीविन

@waLe, awk info पेज से शुरू करें, जिसमें यह वर्णन है कि awk कैसे काम करता है। यहां, मेरे पास 2 "स्थिति {क्रिया}" जोड़े हैं, 2 की कोई शर्त नहीं है जिसका अर्थ है कि हर रिकॉर्ड के लिए कार्रवाई की जाती है। आपके द्वारा पढ़ना समाप्त करने के बाद और आपके पास अभी भी प्रश्न हैं, मुझे बताएं।
ग्लेन जैकमैन

@glennjackman लगभग वहाँ .. बस यह नहीं मिला: फ़ाइल> file.new
w411 3

"फ़ाइल" उस फ़ाइल के नाम का प्रतिनिधित्व करता है जो awk पर काम कर रही है। >शेल पुनर्निर्देशन प्रतीक है, ताकि awk का आउटपुट "file.new" नामक फ़ाइल में संग्रहीत हो।
ग्लेन जैकमैन

16

POSIX sed(और उदाहरण के लिए OS X का sed, sedनीचे) iको बैकस्लैश और एक नई पंक्ति का पालन करना होगा। sedसम्मिलित पाठ के बाद कम से कम OS X में एक नई पंक्ति शामिल नहीं है:

$ seq 3|gsed '2i1.5'
1
1.5
2
3
$ seq 3|sed '2i1.5'
sed: 1: "2i1.5": command i expects \ followed by text
$ seq 3|sed $'2i\\\n1.5'
1
1.52
3
$ seq 3|sed $'2i\\\n1.5\n'
1
1.5
2
3

एक पंक्ति को बदलने के लिए, आप एक संख्यात्मक पते के साथ c(परिवर्तन) या s(स्थानापन्न) कमांड का उपयोग कर सकते हैं :

$ seq 3|sed $'2c\\\n1.5\n'
1
1.5
3
$ seq 3|gsed '2c1.5'
1
1.5
3
$ seq 3|sed '2s/.*/1.5/'
1
1.5
3

उपयोग के विकल्प awk:

$ seq 3|awk 'NR==2{print 1.5}1'
1
1.5
2
3
$ seq 3|awk '{print NR==2?1.5:$0}'
1
1.5
3

awkसाथ पारित चर में व्याख्या बैकस्लैश -vलेकिन चर में नहीं का उपयोग कर पारित कर दिया ENVIRON:

$ seq 3|awk -v v='a\ba' '{print NR==2?v:$0}'
1
a
3
$ seq 3|v='a\ba' awk '{print NR==2?ENVIRON["v"]:$0}'
1
a\ba
3

दोनों ENVIRONऔर -vPOSIX द्वारा परिभाषित कर रहे हैं।


7

पर्ल समाधान:

जल्दी और गन्दी:

perl -lpe 'print "Project_Name=sowstest" if $. == 8' file

  • -l स्ट्रिप्स newlines और उन्हें वापस जोड़ता है, "\ n" की आवश्यकता को समाप्त
  • -p इनपुट फ़ाइल पर लूप्स, हर लाइन को प्रिंट करना
  • -e सिंगल कोट्स में कोड निष्पादित करता है

$. लाइन नंबर है

नामित तर्कों का उपयोग करते हुए @ ग्लेन के awk समाधान के बराबर:

perl -slpe 'print $s if $. == $n' -- -n=8 -s="Project_Name=sowstest" file

  • -s एक अल्पविकसित तर्क पार्सर सक्षम करता है
  • -- रोकता है -n और -s को मानक पर्ल तर्क पार्सर द्वारा पार्स होने से

स्थिति आदेश तर्क:

perl -lpe 'BEGIN{$n=shift; $s=shift}; print $s if $. == $n' 8 "Project_Name=sowstest" file

पर्यावरण चर:

setenv n 8 ; setenv s "Project_Name=sowstest"
echo $n ; echo $s
perl -slpe 'print $ENV{s} if $. == $ENV{n}' file

ENV वह हैश जिसमें सभी पर्यावरण चर होते हैं

हैश% o में तर्कों को पार्स करने के लिए अपनाएँ:

perl -MGetopt::Std -lpe 'BEGIN{getopt("ns",\%o)}; print $o{s} if $. == $o{n}' -- -n 8 -s "Project_Name=sowstest" file

Getopt :: लंबे और लंबे विकल्प नाम

perl -MGetopt::Long -lpe 'BEGIN{GetOptions(\%o,"line=i","string=s")}; print $o{string} if $. == $o{line}' -- --line 8 --string "Project_Name=sowstest" file

Getopt अनुशंसित मानक-पुस्तकालय समाधान है।
यह एक-लाइन पर्ल स्क्रिप्ट के लिए ओवरकिल हो सकता है, लेकिन यह किया जा सकता है


2
आप सभी को समझाने के लिए समय निकालने के लिए क्रिस और यह अच्छी तरह से बाहर ले जाने के लिए यश, लेकिन वाह यही कारण है कि मुझे पसंद नहीं है।
rsaw

5

जो लोग गैर-जीएनयू हैं जो सनोस पर हैं, उनके लिए निम्नलिखित कोड मदद करेगा:

sed '1i\^J
line to add' test.dat > tmp.dat
  • ^ J को ^ V + ^ J के साथ डाला गया है
  • '1i' के बाद नईलाइन जोड़ें।
  • \ _ पंक्ति का अंतिम वर्ण होना चाहिए।
  • कमांड का दूसरा भाग दूसरी लाइन में होना चाहिए।

5

sed -e '8iProject_Name=sowstest' -i start GNU sed का उपयोग करना

नमूना रन:

[root@node23 ~]# for ((i=1; i<=10; i++)); do echo "Line #$i"; done > a_file
[root@node23 ~]# cat a_file
Line #1
Line #2
Line #3
Line #4
Line #5
Line #6
Line #7
Line #8
Line #9
Line #10
[root@node23 ~]# sed -e '3ixxx inserted line xxx' -i a_file 
[root@node23 ~]# cat -An a_file 
     1  Line #1$
     2  Line #2$
     3  xxx inserted line xxx$
     4  Line #3$
     5  Line #4$
     6  Line #5$
     7  Line #6$
     8  Line #7$
     9  Line #8$
    10  Line #9$
    11  Line #10$
[root@node23 ~]# 
[root@node23 ~]# sed -e '5ixxx (inserted) "line" xxx' -i a_file
[root@node23 ~]# cat -n a_file 
     1  Line #1
     2  Line #2
     3  xxx inserted line xxx
     4  Line #3
     5  xxx (inserted) "line" xxx
     6  Line #4
     7  Line #5
     8  Line #6
     9  Line #7
    10  Line #8
    11  Line #9
    12  Line #10
[root@node23 ~]# 

$प्रविष्टि के बाद लाइन 3 पर अनुगामी कहां से आ रही है?
jww

यह -Aझंडे से cat:)
jno

क्या होगा यदि आप जो स्ट्रिंग सम्मिलित करना चाहते हैं, उसमें उद्धरण चिह्न, कोष्ठक आदि शामिल हैं?
एंथ्रोपिक

ऊपर पाठ के लिए अद्यतन देखें। इसका मतलब है, आपको उन वर्णों को उचित रूप से बचाना होगा।
जोनो

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