সেড বা অজকের সাথে নির্দিষ্ট লাইন নম্বরটিতে একটি লাইন প্রবেশ করান


146

আমার কাছে একটি স্ক্রিপ্ট ফাইল রয়েছে যা আমাকে 8 তম লাইনে একটি পাঠ্য সন্নিবেশ করতে অন্য স্ক্রিপ্টের মাধ্যমে সংশোধন করতে হবে।

স্ট্রিং sertোকানো: Project_Name=sowstestএকটি ফাইলের মধ্যে start।

আমি বিশ্রী এবং সিড ব্যবহার করার চেষ্টা করেছি, তবে আমার কমান্ডটি পরিপূর্ণ হয়ে উঠছে।

উত্তর:


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

8 লাইন সন্নিবেশ

8 This is Line 8

ফাইল ফাইল মধ্যে

-i গ্লেন জ্যাকম্যানের মন্তব্যে উল্লিখিত ফাইলটি পরিবর্তনের জন্য সরাসরি ফাইল ফাইল করা যায়, স্টডআউটের কোনও আউটপুট থাকে না।


3
হ্যাঁ, -i সুইচটি জিএনইউ-শেডের জন্য নির্দিষ্ট।
— ব্যবহারকারী অজানা

1
নং -i এর অর্থ "নির্দিষ্ট স্থানে থাকা ফাইলটি সংশোধন করুন"। আই-সুইচ থেকে পৃথক, '8 আইসোমিংথ' বনাম '8 এসোমথিং' দিয়ে সন্নিবেশ বনাম পরিবেশন প্রাপ্ত করা হবে।
— ব্যবহারকারী অজানা

11
ম্যাক ব্যবহারকারীগণ: brew install gnu-sedgsed
— হোমব্রিউ

4
এটি সুপার উপকারী! লাইনের শুরুতে ফাঁকা স্থান toোকানোর জন্য কি আমার পক্ষে আছে? আমি লক্ষ্য করেছি
— সেড

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

ওএস এক্স / ম্যাকোস / ফ্রিবিএসডি sed

-iপতাকা MacOS উপর ভিন্নভাবে কাজ করে sedগনুহ তুলনায় sed।

এটি ম্যাকোস / ওএস এক্সে ব্যবহার করার উপায়:

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

@glenn জ্যাকম্যান আমাকে #define SERVER@"http://10.35.42.54/ms0.8"একটি নির্দিষ্ট লাইনে প্রবেশ করতে হবে। আমি কীভাবে এটি অর্জন করতে পারি?
— নেভিন রাজ ভিক্টর

1
আমার মনে হয় নেভিনের ব্যাকস্ল্যাশগুলির সাথে তার স্ট্রিংয়ের উদ্ধৃতিগুলি কেবল পালানো দরকার
— ক্রিস কোকনাট

@waLLe, দিয়ে শুরু awk info পৃষ্ঠায় কীভাবে awk কাজ একটি চমৎকার বিবরণ নেই। এখানে, আমার কাছে 2 "শর্ত {ক্রিয়া}" জোড়া রয়েছে, ২ য় এর কোনও শর্ত নেই যার অর্থ প্রতিটি রেকর্ডের জন্য ক্রিয়া সঞ্চালিত হয়। আপনি পড়া শেষ করার পরে এবং আপনার এখনও প্রশ্ন রয়েছে, আমাকে জানান।
— গ্লেন জ্যাকম্যান

@glennjackman প্রায় সেখানে আছে .. কেবল এটি পেলেন না: ফাইল> file.new
— w411 3

"ফাইল" সেই ফাইলটির নাম উপস্থাপন করে যা অবসান কাজ করছে। >শেল পুনর্নির্দেশ প্রতীক যাতে awk এর আউটপুট "file.new" নামক ফাইলে সংরক্ষণ করা হয়।
— গ্লেন জ্যাকম্যান

16

POSIX sed(এবং উদাহরণস্বরূপ OS X এর এর জন্য sed, sedনীচে) প্রয়োজন iএকটি ব্যাকস্ল্যাশ এবং একটি newline দ্বারা অনুসরণ করা হয়। কমপক্ষে ওএস এক্স এর sedঅন্তর্ভুক্ত পাঠ্যের পরে কোনও নতুন লাইন অন্তর্ভুক্ত নয়:

$ 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এবং -vপসিক্স দ্বারা সংজ্ঞায়িত করা হয়।


7

পার্ল সমাধান:

দ্রুত এবং ময়লা:

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

  • -l "\ n" এর প্রয়োজনীয়তা বাদ দিয়ে নতুন লাইনের স্ট্র্যাপগুলি এনে আবার এগুলিকে যুক্ত করে
  • -p ইনপুট ফাইলের উপর লুপ করে, প্রতিটি লাইন মুদ্রণ করে
  • -e একক উদ্ধৃতিতে কোড চালায়

$. লাইন নম্বর

নামযুক্ত আর্গুমেন্টগুলি ব্যবহার করে @ গ্লেনের অ্যাডক সমাধানের সমতুল্য:

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

গেটপট হ'ল প্রস্তাবিত মান-গ্রন্থাগার সমাধান।
এটি এক-লাইন পার্ল স্ক্রিপ্টগুলির জন্য ওভারকিল হতে পারে, তবে এটি করা যেতে পারে


2
আপনার কাছে ক্রিস কুদোস সমস্ত কিছু ব্যাখ্যা করার জন্য সময় নিয়েছে এবং এটিকে এত সুন্দরভাবে ছড়িয়ে দিয়েছে, তবে বাহ এই কারণেই আমি পার্ল পছন্দ করি না।
— rsaw

5

যারা সুনোস-এ রয়েছেন যা নন-জিএনইউ, তাদের জন্য নিম্নলিখিত কোডটি সহায়তা করবে:

sed '1i\^J
line to add' test.dat > tmp.dat
  • ^ J ^ V + ^ J সহ সন্নিবেশ করানো হয়েছে
  • '1i এর পরে নতুন লাইন যুক্ত করুন।
  • The লাইনের শেষ চরিত্র হওয়া আবশ্যক।
  • কমান্ডের দ্বিতীয় অংশটি অবশ্যই দ্বিতীয় লাইনে থাকতে হবে।

5

sed -e '8iProject_Name=sowstest' -i start GNU সেড ব্যবহার করে

নমুনা রান:

[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 থেকে পিছনটি কোথায় আসছে?
— jwww

এটি -Aপতাকা থেকে cat:)
— জান্নাত

আপনি যে স্ট্রিংটি সন্নিবেশ করতে চান তাতে যদি উদ্ধৃতি চিহ্ন, প্রথম বন্ধনী ইত্যাদি থাকে?
— এ্যান্ট্রোপিক

উপরের লেখায় আপডেট দেখুন। তার মানে, আপনাকে যথাযথভাবে সেই চরগুলি থেকে বাঁচতে হবে।
— jno

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.