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


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.