মাল্টি-লাইন স্ট্রিং প্রতিস্থাপনের জন্য আমি কীভাবে সেড ব্যবহার করতে পারি?


243

আমি লক্ষ্য করেছি যে, যদি আমি \nব্যবহারের পরিবর্তে কোনও প্যাটার্ন যুক্ত করি তবে sedএটি মেলে না। উদাহরণ:

$ cat > alpha.txt
This is
a test
Please do not
be alarmed

$ sed -i'.original' 's/a test\nPlease do not/not a test\nBe/' alpha.txt

$ diff alpha.txt{,.original}

$ # No differences printed out

আমি কীভাবে এটি কাজ করতে পারি?


এখানে স্মার্ট ওয়ার্কআউন্ড : unix.stackexchange.com/a/445666/61742 । অবশ্যই এটি পারফর্ম্যাটিক নয়! আপনার প্রয়োজন অনুসারে প্রতিস্থাপন সম্পাদনের জন্য অন্যান্য ভাল বিকল্পগুলি শঙ্কিত, পার্ল এবং পাইথন হতে পারে। আরও অনেকে আছেন, তবে আমি বিশ্বাস করি যে বিভিন্ন লিনাক্স বিতরণে উদাহরণস্বরূপ awk সর্বাধিক সর্বজনীন। ধন্যবাদ!
এডুয়ার্ডো লুসিও

উত্তর:


235

সেডের সহজ কলিংয়ে , এটির প্যাটার্ন স্পেসে পাঠ্যক্রমের এক লাইন রয়েছে, অর্থাৎ। \nইনপুট থেকে সীমিত পাঠের 1 লাইন । প্যাটার্ন স্পেসের একক লাইনের কোনও নেই \n... সে কারণেই আপনার রেজেক্স কিছুই খুঁজে পাচ্ছে না ।

আপনি প্যাটার্ন-স্পেসে একাধিক লাইন পড়তে পারেন এবং আশ্চর্যজনকভাবে জিনিসগুলি হেরফের করতে পারেন, তবে সাধারণ প্রচেষ্টার চেয়ে আরও বেশি কিছু দিয়ে .. শেডের একটি কমান্ডের একটি সেট রয়েছে যা এই ধরণের জিনিসটিকে অনুমতি দেয় ... সেডের জন্য কমান্ডের সংক্ষিপ্তসারটির এখানে একটি লিঙ্ক দেওয়া হয়েছে । এটি আমি খুঁজে পেয়েছি সেরাটি, এবং আমাকে ঘূর্ণায়মান।

তবে একবার আপনি সেডের মাইক্রো-কমান্ডগুলি ব্যবহার শুরু করার পরে "ওয়ান-লাইনার" ধারণাটি ভুলে যান। যতক্ষণ না আপনি এটির অনুভূতি না পান ততক্ষণ স্ট্রাকচার্ড প্রোগ্রামের মতো এটিকে আটকানো দরকারী ... এটি আশ্চর্যজনকভাবে সহজ এবং একইরকম অস্বাভাবিক। আপনি এটিকে পাঠ্য সম্পাদনার "একত্রিত ভাষা" হিসাবে ভাবতে পারেন।

সংক্ষিপ্তসার: সাধারণ জিনিসগুলির জন্য সেড ব্যবহার করুন এবং সম্ভবত কিছুটা বেশি, তবে সাধারণভাবে, যখন এটি একটি লাইনের সাথে কাজ করার বাইরে চলে যায়, বেশিরভাগ লোক অন্য কিছুকে পছন্দ করে ...
আমি অন্য কাউকে অন্য কিছু প্রস্তাব দিতে দেব .. আমি সেরা পছন্দটি কী হবে তা সত্যিই নিশ্চিত নয় (আমি সেড ব্যবহার করব তবে এটি পার্ল সম্পর্কে ভালভাবে জানিনা))


sed '/^a test$/{
       $!{ N        # append the next line when not on the last line
         s/^a test\nPlease do not$/not a test\nBe/
                    # now test for a successful substitution, otherwise
                    #+  unpaired "a test" lines would be mis-handled
         t sub-yes  # branch_on_substitute (goto label :sub-yes)
         :sub-not   # a label (not essential; here to self document)
                    # if no substituion, print only the first line
         P          # pattern_first_line_print
         D          # pattern_ltrunc(line+nl)_top/cycle
         :sub-yes   # a label (the goto target of the 't' branch)
                    # fall through to final auto-pattern_print (2 lines)
       }    
     }' alpha.txt  

এখানে এটি একই স্ক্রিপ্ট, এতে স্পষ্টতই পড়ার এবং এর সাথে কাজ করা আরও কঠিন, তবে কিছু লোক সন্দেহজনকভাবে ওয়ান- লাইনারকে কল করবে

sed '/^a test$/{$!{N;s/^a test\nPlease do not$/not a test\nBe/;ty;P;D;:y}}' alpha.txt

এখানে আমার আদেশ "প্রতারণা"

:  # label
=  # line_number
a  # append_text_to_stdout_after_flush
b  # branch_unconditional             
c  # range_change                     
d  # pattern_delete_top/cycle          
D  # pattern_ltrunc(line+nl)_top/cycle 
g  # pattern=hold                      
G  # pattern+=nl+hold                  
h  # hold=pattern                      
H  # hold+=nl+pattern                  
i  # insert_text_to_stdout_now         
l  # pattern_list                       
n  # pattern_flush=nextline_continue   
N  # pattern+=nl+nextline              
p  # pattern_print                     
P  # pattern_first_line_print          
q  # flush_quit                        
r  # append_file_to_stdout_after_flush 
s  # substitute                                          
t  # branch_on_substitute              
w  # append_pattern_to_file_now         
x  # swap_pattern_and_hold             
y  # transform_chars                   

167
আমাকে এখন গুলি কর। সবচেয়ে খারাপ সিনট্যাক্স!
গিলি

53
এটি একটি দুর্দান্ত ব্যাখ্যা, তবে আমি @ গিলির সাথে একমত হতে আগ্রহী।
gatoatigrado

11
আপনার ঠকানো শীট সব আছে।
কনসোলবক্স

3
tকমান্ডটি ব্যবহার করতে আপনার এখানে কোনও লেবেল লাগবে না — যখন কোনও লেবেলটি স্ক্রিপ্টের শেষে শাখাগুলির ডিফল্ট হয় না। সুতরাং sed '/^a test$/{$!{N;s/^a test\nPlease do not$/not a test\nBe/;t;P;D}}' alpha.txtসব পরিস্থিতিতে আপনার আদেশ হিসাবে ঠিক একই কাজ করে। অবশ্যই এই নির্দিষ্ট ফাইলের জন্য, sed '/test/{N;s/.*/not a test\nBe/}' alpha.txtএকই জিনিসটিও করে তবে আমার প্রথম উদাহরণটি সমস্ত সম্ভাব্য ফাইলের জন্য যৌক্তিকভাবে সমতুল্য । এছাড়াও মনে রাখবেন যে \nপ্রতিস্থাপনের স্ট্রিংয়ে একটি নতুন লাইন তৈরি হয় না; এটি করার জন্য আপনার একটি ব্যাকস্ল্যাশ `\` এর পরে সত্যিকারের নিউলাইন দরকার।
ওয়াইল্ডকার্ড

9
মনে রাখবেন যে সিনট্যাক্সটি জিএনইউ নির্দিষ্ট ( #কমান্ড পূর্বের থেকে পৃথক নয়, \nআরএইচএসের মধ্যে s)। জিএনইউ দিয়ে sedআপনি -zNUL সীমাবদ্ধ রেকর্ডগুলিও ব্যবহার করতে পারেন (এবং তারপরে পুরো ইনপুটটিতে স্লার্প করুন যদি এটি পাঠ্য হয় (যার সংজ্ঞায় NULs থাকে না))।
স্টাফেন চেজেলাস

181

এর perlপরিবর্তে ব্যবহার করুন sed:

$ perl -0777 -i.original -pe 's/a test\nPlease do not/not a test\nBe/igs' alpha.txt
$ diff alpha.txt{,.original}
2,3c2,3
< not a test
< Be
---
> a test
> Please do not

-pi -eআপনার মানকটি "জায়গায় প্রতিস্থাপন করুন" কমান্ড-লাইন ক্রম এবং -0777 পার্লকে পুরো ফাইল স্লুর্পে পরিণত করে। আরও জানার জন্য পার্ল্ডোক পার্লারুন দেখুন ।


3
ধন্যবাদ! মাল্টলাইন কাজের জন্য, পার্ল হাতছাড়া! আমি জায়গায় জায়গায় ফাইলটি পরিবর্তন করতে `l পার্ল -পি-পি'এস / বার / বাজ / 'ফাইলএ` ব্যবহার করে শেষ করেছি।
নিকোলাস টলি কট্রেল

3
এটি খুব সাধারণ যে আসল পোস্টারটি জিজ্ঞাসা করে sedএবং জব বা পার্ল ব্যবহার করে উত্তরগুলি উপস্থিত হয়। আমি মনে করি এটি বিষয়টিতে নেই, তাই দুঃখিত, তবে আমি একটি বিয়োগফল বরখাস্ত করেছি।
রোহ ফাই

68
+1 এবং রবার্তোর সাথে একমত নন। প্রায়শই ভাল পদ্ধতিগুলির অজ্ঞতার জন্য বিশেষত প্রশ্নগুলি উত্থাপিত হয়। যখন এখানে যথাযথ প্রাসঙ্গিক পার্থক্য নেই (যেমন এখানে), অনুকূল সমাধানগুলি প্রশ্ন-নির্দিষ্ট হিসাবে কমপক্ষে যতটা প্রোফাইল পাওয়া উচিত।
ভূগোলিক

56
আমি মনে করি sedউপরের উত্তরটি প্রমাণ করে যে পার্ল উত্তরটি বিষয়ে।
রিইনারপোস্ট

7
কিছুটা সহজ: "-p0e" দিয়ে "-0777" প্রয়োজনীয় নয়। unix.stackexchange.com/a/181215/197502
ওয়েডেনরিন্দে

96

আমি মনে করি, \nপ্রতীকটি অন্য কোনও চিহ্নের সাথে প্রতিস্থাপন করা ভাল , এবং তারপরে যথারীতি কাজ করুন:

উদাহরণস্বরূপ না-কাজ করা উত্স কোড:

cat alpha.txt | sed -e 's/a test\nPlease do not/not a test\nBe/'

এতে পরিবর্তন করা যেতে পারে:

cat alpha.txt | tr '\n' '\r' | sed -e 's/a test\rPlease do not/not a test\rBe/'  | tr '\r' '\n'

যদি কেউ না জানে \nতবে ইউনিক্স লাইনটি কি শেষ হচ্ছে \r\n- উইন্ডোজ \r- ক্লাসিক ম্যাক ওএস। সাধারণ ইউনিক্স পাঠ্য \rপ্রতীক ব্যবহার করে না , সুতরাং এই ক্ষেত্রে এটি ব্যবহার করা নিরাপদ।

অস্থায়ীভাবে প্রতিস্থাপন করতে আপনি কিছু বিদেশী প্রতীকও ব্যবহার করতে পারেন \ n। উদাহরণ হিসাবে - \ f (ফর্ম ফিড প্রতীক)। আপনি এখানে আরও চিহ্ন পেতে পারেন ।

cat alpha.txt | tr '\n' '\f' | sed -e 's/a test\fPlease do not/not a test\fBe/'  | tr '\f' '\n'

11
এই চালাক হ্যাকের জন্য +1! আপনার সম্পাদনা করা ফাইলটির বিষয়বস্তু সম্পর্কে আপনি যদি নিশ্চিত না হন তবে অস্থায়ীভাবে নতুন লাইনের প্রতিস্থাপন করতে বহিরাগত প্রতীকটি ব্যবহার করার পরামর্শটি বিশেষত কার্যকর।
L0j1k

এই যেমন পরিবর্তে OS X এর লেখা, এক সমস্ত উদাহরণ প্রতিস্থাপন করার প্রয়োজন কাজ করে না \rথেকে যুক্তি sedদিয়ে $(printf '\r')
abeboparebop

@abeboparebop: দুর্দান্ত খুঁজে! Ly বিকল্পভাবে, হোমব্রিউ ব্যবহার করে GNU সেড ইনস্টল করুন: stackoverflow.com/a/30005262
এসএসসি

@abeboparebop, ওএসএক্স-এ, সেড $স্ট্রিংয়ের আগে এটির রূপান্তরিত হওয়া থেকে রোধ করার জন্য \rআপনাকে কেবল একটি যুক্ত করা দরকার r। সংক্ষিপ্ত উদাহরণ: sed $'s/\r/~/'। পুরো উদাহরণ:cat alpha.txt | tr '\n' '\r' | sed $'s/a test\rPlease do not/not a test\rBe/' | tr '\r' '\n'
উইসবাকী

40

সমস্ত বিষয় বিবেচনা করা হয়, পুরো ফাইলটি গবলিং করা দ্রুততম উপায় হতে পারে।

বেসিক সিনট্যাক্সটি নিম্নরূপ:

sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'

মনে রাখবেন, ফাইলটি প্রচণ্ড পরিমাণে বড় হলে পুরো ফাইলটি গব্জ করা কোনও বিকল্প হতে পারে না। এই জাতীয় ক্ষেত্রে, এখানে সরবরাহিত অন্যান্য উত্তরগুলি কাস্টমাইজড সমাধান দেয় যা একটি ছোট মেমরির পদক্ষেপে কাজ করার গ্যারান্টিযুক্ত।

অন্যান্য সমস্ত হ্যাক এবং স্ল্যাশ পরিস্থিতির জন্য, কেবলমাত্র -e '1h;2,$H;$!d;g'আপনার মূল sedরেজেক্স যুক্তি দ্বারা প্রিপেন্ডিংয়ের কাজটি বেশ কার্যকর হয়ে যায়।

যেমন

$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat

কি করে -e '1h;2,$H;$!d;g'?

1, 2,$, $!অংশের লাইন যে সীমা যা লাইন সরাসরি নিম্নলিখিত কমান্ড উপর সঞ্চালিত হয় specifiers হয়।

  • 1: প্রথম লাইন
  • 2,$: দ্বিতীয় থেকে শুরু সমস্ত লাইন
  • $!: শেষ ছাড়া অন্য প্রতিটি লাইন

এতটা প্রসারিত, এন লাইনের ইনপুটগুলির প্রতিটি লাইনে এটিই ঘটে।

  1: h, d
  2: H, d
  3: H, d
  .
  .
N-2: H, d
N-1: H, d
  N: H, g

gকমান্ড লাইন সুনির্দিষ্টভাবে উল্লেখ করা দেওয়া হয়, কিন্তু পূর্ববর্তী dকমান্ড একটি বিশেষ ধারা আছে " স্টার্ট পরবর্তী চক্র। ", এবং বাধা দেয় gগত ছাড়া সমস্ত লাইন চালু করা থেকে।

প্রতিটি আদেশের অর্থ হিসাবে:

  • প্রথম hদ্বারা অনুসরণ Hপ্রতিটি লাইনে কপি উপর গুলি মধ্যে ইনপুট লাইনের বলেন sed'র হোল্ড স্থান । (যথেচ্ছ পাঠ্য বাফারটি ভাবুন))
  • এরপরে, dপ্রতিটি লাইনে এই লাইনগুলি আউটপুটে লেখা থেকে বিরত রাখতে বাতিল করে দেয়। হোল্ড স্থান তবে সংরক্ষিত হয়।
  • শেষ gঅবধি , সর্বশেষ লাইনে হোল্ড স্পেস থেকে প্রতিটি লাইন জমা হওয়া পুনরুদ্ধার করে যাতে sedপুরো ইনপুটটিতে তার রেজেক্স চালাতে সক্ষম হয় (লাইন-এ-এ-টাইম ফ্যাশনের পরিবর্তে) এবং তাই সক্ষম \nএস উপর ম্যাচ ।

38

sedতিনটি কমান্ড বহু-লাইন অপারেশন পরিচালনা করতে হয়েছে N, Dএবং P(তাদের তুলনা স্বাভাবিক n , dএবং p)।

এই ক্ষেত্রে, আপনি আপনার প্যাটার্নের প্রথম লাইনের সাথে মেলে ফেলতে পারেন, Nদ্বিতীয় লাইনটি প্যাটার্ন স্পেসে সংযুক্ত করতে এবং তারপরে sআপনার প্রতিস্থাপনটি করতে ব্যবহার করতে পারেন।

কিছুটা এইরকম:

/a test$/{
  N
  s/a test\nPlease do not/not a test\nBe/
}

2
এটা সত্যিই দারুন! গৃহীত উত্তরের চেয়ে সহজ এবং এখনও কার্যকর।
jeyk

সব হোল্ড স্থান (জড়িত বেশী G, H, x...)। sকমান্ডের সাহায্যে প্যাটার্ন স্পেসে আরও লাইন যুক্ত করা যেতে পারে ।
স্টাফেন চেজেলাস


এই সমাধানটি নিম্নলিখিত কেসের সাথে কাজ করে না "এটি \ না পরীক্ষা \ না পরীক্ষা \ n দয়া করে সতর্ক হন না" "
mug896

@ মগ 896 আপনার সম্ভবত একাধিক Nকমান্ডের প্রয়োজন আছে
loa_in_

15

আপনি পারেন কিন্তু এটা কঠিন । আমি অন্য কোনও সরঞ্জামে স্যুইচ করার পরামর্শ দিচ্ছি। যদি কোনও নিয়মিত প্রকাশ থাকে যা আপনি প্রতিস্থাপন করতে চান এমন পাঠ্যের কোনও অংশের সাথে কখনই মেলে না, আপনি এটি GNU awk এ একটি awk রেকর্ড বিভাজক হিসাবে ব্যবহার করতে পারেন।

awk -v RS='a' '{gsub(/hello/, "world"); print}'

যদি আপনার অনুসন্ধানের স্ট্রিংগুলিতে কখনও টানা দুটি নিউলাইন না থাকে, আপনি awk এর "অনুচ্ছেদ মোড" (এক বা একাধিক ফাঁকা লাইন পৃথক রেকর্ড) ব্যবহার করতে পারেন।

awk -v RS='' '{gsub(/hello/, "world"); print}'

পার্ল ব্যবহার করা এবং ফাইলটিকে মেমরিতে পুরোপুরি লোড করা একটি সহজ সমাধান।

perl -0777 -pe 's/hello/world/g'

1
পার্ল কমান্ড কিভাবে একটি ফাইল প্রয়োগ করবেন?
sebix

2
@sebix perl -0777 -pe '…' <input-file >output-file। জায়গায় কোনও ফাইল পরিবর্তন করতেperl -0777 -i -pe '…' filename
গিলস

3
আরও দেখুন গনুহ sedএর -zবিকল্প (2012 সালে যোগ পর যে উত্তর পোস্ট করা হয়েছে): seq 10 | sed -z 's/4\n5/a\nb/'
স্টাফেন চেজেলাস

7

আমি মনে করি এটি 2 লাইন মিলের জন্য সেড সমাধান।

sed -n '$!N;s@a test\nPlease do not@not a test\nBe@;P;D' alpha.txt

আপনি যদি 3 টি লাইন মেলাতে চান তবে ...

sed -n '1{$!N};$!N;s@aaa\nbbb\nccc@xxx\nyyy\nzzz@;P;D'

আপনি যদি 4 টি লাইন মেলাতে চান তবে ...

sed -n '1{$!N;$!N};$!N;s@ ... @ ... @;P;D'

"S" কমান্ডের প্রতিস্থাপনের অংশটি যদি লাইনগুলি সঙ্কুচিত করে তবে আরও কিছুটা জটিল

# aaa\nbbb\nccc shrink to one line "xxx"

sed -n '1{$!N};$!N;/aaa\nbbb\nccc/{s@@xxx@;$!N;$!N};P;D'

যদি প্রতিস্থাপনের অংশটি লাইনগুলি বাড়ায় তবে এর মতো আরও কিছুটা জটিল

# aaa\nbbb\nccc grow to five lines vvv\nwww\nxxx\nyyy\nzzz

sed -n '1{$!N};$!N;/aaa\nbbb\nccc/{s@@vvv\nwww\nxxx\nyyy\nzzz@;P;s/.*\n//M;P;s/.*\n//M};P;D'

এটি শীর্ষে যেতে হবে! আমি দুটি লাইন প্রতিস্থাপনের জন্য "-i" এর পরিবর্তে "-i" ব্যবহার করেছি, কারণ ঘটনাক্রমে এটি আমার প্রয়োজন, এবং ঘটনাক্রমে এটিও প্রশ্নকারীর উদাহরণে।
নাগেভ

5
sed -i'.original' '/a test/,/Please do not/c not a test \nBe' alpha.txt

এখানে /a test/,/Please do not/(মাল্টি লাইন) পাঠ্যের ব্লক হিসাবে বিবেচনা করা হয়, cএটি নতুন পাঠ্যের পরে পরিবর্তন কমান্ডnot a test \nBe

পাঠ্যটি প্রতিস্থাপনের ক্ষেত্রে খুব দীর্ঘ, আমি প্রাক্তন বাক্য গঠনের পরামর্শ দেব ।


ওহো সমস্যাটি হ'ল
সেড

4
sed -e'$!N;s/^\(a test\n\)Please do not be$/not \1Be/;P;D' <in >out

ইনপুটটিতে আপনার উইন্ডোটি কিছুটা প্রশস্ত করুন।

এটা বেশ সহজ। স্ট্যান্ডার্ড প্রতিস্থাপন ছাড়াও; আপনি শুধুমাত্র প্রয়োজন $!N, Pএবং Dএখানে।


4

পার্ল ব্যতীত স্ট্রিমগুলির জন্য মাল্টলাইন সম্পাদনা করার জন্য একটি সাধারণ এবং সহজ পদ্ধতি (এবং ফাইলগুলিও):

উদাহরণস্বরূপ প্রথমে আপনার পছন্দমতো কিছু নতুন ইউনিক্য্যু লাইন বিভাজক তৈরি করুন

$ S=__ABC__                     # simple
$ S=__$RANDOM$RANDOM$RANDOM__   # better
$ S=$(openssl rand -hex 16)     # ultimate

তারপরে আপনার সেড কমান্ডে (বা অন্য কোনও সরঞ্জাম) আপনি \ n $ {S by দ্বারা পছন্দ করুন like

$ cat file.txt | awk 1 ORS=$S |  sed -e "s/a test${S}Please do not/not a test\nBe/" | awk 1 RS=$S > file_new.txt

(অ্যাডাব্লুয়ালিটি এএসসিআইআই লাইন বিভাজকটিকে আপনার এবং এর বিপরীতে প্রতিস্থাপন করে))


2

এটি ওএস এক্সে কাজ করার জন্য xara এর চতুর উত্তরের একটি ছোট পরিবর্তন (আমি 10.10 ব্যবহার করছি):

cat alpha.txt | tr '\n' '\r' | sed -e 's/a test$(printf '\r')Please do not/not a test$(printf '\r')Be/'  | tr '\r' '\n'

স্পষ্টভাবে ব্যবহার করার পরিবর্তে \r, আপনাকে ব্যবহার করতে হবে $(printf '\r')


1
যদিও printf '\r'(অথবা echo -e '\r') ঠিকমত কাজ না, দয়া করে মনে রাখবেন যে আপনি শুধু শেল সিনট্যাক্স ব্যবহার করতে পারেন $'\r'পলান লিটারেল পড়ুন। উদাহরণস্বরূপ, এবং এর echo hi$'\n'thereমধ্যে একটি নতুন লাইন প্রতিধ্বনিত হবে । একইভাবে, আপনি পুরো স্ট্রিংটি মোড়ানো করতে পারেন যাতে প্রতিটি ব্যাকস্ল্যাশ তার পরবর্তী চরিত্রটি থেকে বাঁচতে পারে:hithere\ echo $'hi\nthere'
দেজয় ক্লেটন

1

আমি সেড ব্যবহার করে কোনও ফাইলে এইচটিএমএলের কয়েকটি লাইন যুক্ত করতে চেয়েছিলাম, (এবং এখানেই শেষ হয়েছে)। সাধারণত আমি কেবল পার্ল ব্যবহার করতাম, তবে আমি বাক্সে ছিলাম যেগুলিতে সেড, বাশ ছিল এবং অন্য কিছু ছিল না। আমি দেখতে পেলাম যে আমি যদি স্ট্রিংটিকে একটি একক লাইনে পরিবর্তন করি এবং ব্যাশ / সেডকে worked t \ n দিয়ে সমস্ত কিছু শেষ করে দেয়:

HTML_FILE='a.html' #contains an anchor in the form <a name="nchor" />
BASH_STRING_A='apples'
BASH_STRING_B='bananas'
INSERT="\t<li>$BASH_STRING_A<\/li>\n\t<li>$BASH_STRING_B<\/li>\n<a name=\"nchor\"\/>"
sed -i "s/<a name=\"nchor"\/>/$INSERT/" $HTML_FILE

ডাবল কোট এবং ফরোয়ার্ড-স্ল্যাশগুলি এড়ানোর জন্য কোনও ফাংশন রাখা পরিষ্কার হবে তবে কখনও কখনও বিমূর্ততা হ'ল সময়ের চোর।


1

জিএনইউতে sedএকটি -zবিকল্প রয়েছে যা ওপি প্রয়োগের চেষ্টা করা সিনট্যাক্স ব্যবহার করতে দেয়। ( ম্যান পেজ )

উদাহরণ:

$ cat alpha.txt
This is
a test
Please do not
be alarmed
$ sed -z 's/a test\nPlease do not\nbe/not a test\nBe/' -i alpha.txt
$ cat alpha.txt
This is
not a test
Be alarmed

সচেতন থাকুন: আপনি যদি ব্যবহার করেন ^এবং $সেগুলি এখন NUL চরিত্রের সাথে ডিলিমেটেড লাইনের শুরু এবং শেষের সাথে মেলে \n। এবং, আপনার সমস্ত ( \nবিযুক্ত) লাইনগুলিতে ম্যাচগুলি প্রতিস্থাপিত হয়েছে তা নিশ্চিত করতে, gবিশ্বব্যাপী বিকল্পগুলির জন্য (যেমন s/.../.../g) পতাকা ব্যবহার করতে ভুলবেন না ।


ক্রেডিট: @ stéphane-chazelas উপরোক্ত একটি মন্তব্যে প্রথম -z উল্লেখ করেছেন


0

সেড নিউলাইনগুলিতে ইনপুট ব্রেক করে। এটি প্রতি লুপে এক লাইন রাখে।
অতএব \n, প্যাটার্ন স্পেসটি না থাকলে কোনও (নিউলাইন) মেলানোর কোনও উপায় নেই।

একটি উপায় রয়েছে, তবে আপনি লুপটি ব্যবহার করে প্যাটার্ন স্পেসে টানা দুটি রেখা রাখতে পারবেন :

sed 'N;l;P;D' alpha.txt

এন এবং পি এর মধ্যে যে কোনও প্রক্রিয়াকরণ প্রয়োজন যোগ করুন (পরিবর্তিত করে l)।

এই ক্ষেত্রে (2 লাইন):

$ sed 'N;s/a test\nPlease do not/not a test\nBe/;P;D' alpha.txt
This is
not a test
Be
be alarmed

বা, তিন লাইনের জন্য:

$ sed -n '1{$!N};$!N;s@a test\nPlease do not\nbe@not a test\nDo\nBe@;P;D' alpha.txt 
This is
not a test
Do
Be alarmed

এটি ধরে নিয়েছে যে একই পরিমাণ লাইন প্রতিস্থাপন হয়।

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