কোনও প্যাটার্নের সামনে একটি নিউলাইন কীভাবে প্রবেশ করবেন?


138

একটি লাইনের মধ্যে কোনও প্যাটার্নের আগে একটি নিউলাইন কীভাবে সন্নিবেশ করা যায়?

উদাহরণস্বরূপ, এটি রেজেক্স প্যাটার্নের পিছনে একটি নতুন লাইন প্রবেশ করবে ।

sed 's/regex/&\n/g'

আমি কীভাবে একই প্যাটার্নের সামনে থাকতে পারি ?

এই নমুনা ইনপুট ফাইলটি দেওয়া, প্যাটার্নটির সাথে মেলে ফোন নম্বরটি।

some text (012)345-6789

হয়ে উঠতে হবে

some text
(012)345-6789

কেবলমাত্র এখানে sed '/regex/G'
সড

1
@ নীলসনবার্থ, সোজা প্রশ্নটি কেন খারাপ প্রশ্ন?
জোশ

উত্তর:


177

এই কাজ করে bashএবং zsh, Linux এবং OS X এর উপর পরীক্ষা:

sed 's/regexp/\'$'\n/g'

সাধারণভাবে, $একক উদ্ধৃতিতে একটি স্ট্রিং আক্ষরিক জন্য bashসি-স্টাইলের ব্যাকস্ল্যাশ প্রতিস্থাপন সম্পাদন করে, উদাহরণস্বরূপ $'\t'একটি আক্ষরিক ট্যাবে অনুবাদ করা হয়। এছাড়াও, সেড আপনার নিউলাইন আক্ষরিককে ব্যাকস্ল্যাশ দিয়ে পালাতে চান, তাই এর \আগে $। এবং পরিশেষে, ডলার সাইন নিজেই উদ্ধৃত করা উচিত নয় যাতে এটি শেল দ্বারা ব্যাখ্যা করা হয়, সুতরাং আমরা এর আগে উদ্ধৃতিটি বন্ধ করি $এবং তারপরে এটি আবার খুলি।

সম্পাদনা : @ এমকিলেটমেন্ট 0-এর মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, এটি কাজ করে:

sed $'s/regexp/\\\n/g'

এখানে যা ঘটে তা হ'ল: পুরো সেড কমান্ডটি এখন সি-স্টাইলের স্ট্রিং, যার অর্থ ব্যাকস্ল্যাশ যা সেডকে নতুন লাইনের আক্ষরিক আগে স্থাপন করা দরকার এখন অন্য একটি ব্যাকস্ল্যাশ দিয়ে পালানো উচিত। যদিও আরও পাঠযোগ্য, তবে এক্ষেত্রে আপনি শেল স্ট্রিং বিকল্পগুলি (এটি আবার কুরুচিপূর্ণ না করেই করতে পারবেন না)


7
এটি আমাকে ওএসএক্সের "বিকল্প প্যাটার্নের অভ্যন্তরে অবিচ্ছিন্ন নিউলাইন" দেয়।
ম্যাট গিবসন

@ ম্যাট গিবসন এটি অত্যন্ত বিস্ময়কর কারণ "অপরিবর্তিত নিউলাইন" কেবল তখনই দেওয়া হয় যখন আপনি প্রতিস্থাপনের প্যাটার্নে ব্যাকস্ল্যাশ ছাড়াই সত্যিকারের নতুন লাইন পাবেন। আমার কোড উপরে কাজ করে, বাস্তবে, অন্য কয়েকটি শেলের মধ্যেও, যেমন zsh, ksh।
মোজুবা

3
@ ম্যাট গিবসন ... বা আপনি যদি আমার কোডটিতে '$' before n এর আগে ব্যাকস্ল্যাশটি ভুলে যান তবে।
মোজুবা

7
যেমন লেখা আছে, এই এক্সপ্রেশনগুলি অনুরোধ হিসাবে বিদ্যমান লাইনের মাঝখানে একটি নতুন লাইন সন্নিবেশ করার পরিবর্তে পুরোপুরি একটি নতুন লাইনের সাথে রেজেক্সকে প্রতিস্থাপন করবে। এখানে কিভাবে আমি দুই মিলেছে নিদর্শন মধ্যে একটি newline সন্নিবেশ করাতে এই উত্তর একটি পরিবর্তিত আকারে ব্যবহৃত হল: sed '\(first match\)\(second match\)/\1\'$'\n''\2/g'। দুটি একক উদ্ধৃতি Note n এর পরে নোট করুন। প্রথমটি " $" বিভাগটি বন্ধ করে দেয় যাতে লাইনের বাকী অংশগুলি এর দ্বারা প্রভাবিত না হয়। এই উদ্ধৃতিগুলি ছাড়া, \ 2 উপেক্ষা করা হয়েছিল।
ডেভিড রাভেট্টি

12
আরেকটি বিকল্প হ'ল একটি একক এএনএসআই সি-উদ্ধৃত স্ট্রিং ব্যবহার করা : sed $'s/regexp/\\\n/g'যা পাঠযোগ্যতার উন্নতি করে - একমাত্র সতর্কতা হ'ল আপনাকে তখন সমস্ত আক্ষরিক অক্ষর দ্বিগুণ করতে হবে \
mklement0

43

অন্যান্য উত্তরগুলির কয়েকটি আমার সেডের সংস্করণটির জন্য কাজ করে নি। অবস্থান স্যুইচিং &এবং \nকাজ করেনি।

sed 's/regexp/\n&/g' 

সম্পাদনা: এটি ইনস্টল না করা পর্যন্ত এটি OS X এ কাজ করবে বলে মনে হচ্ছে না gnu-sed


9
আমি নিশ্চিত না যে এটি সেডের সমস্ত সংস্করণে কাজ করে। আমি আমার ম্যাকটিতে এটি চেষ্টা করেছি এবং \ n কেবল 'এন' হিসাবে আউটপুট পাবে
টড গাম্বলিন

3
আপনার উত্তরটি পড়ার আগে ম্যাকের উপর 15 মিনিট সময় ব্যয় করুন। অ্যাপল যাও!
রিক 77

1
Homebrew ব্যবহার করছেন তাদের জন্য: brew install gnu-sedদ্বারা অনুসরণgsed 's/regexp/\n&/g'
aaaaaa

1
... এরপরেecho 'alias sed=gsed' >> ~/.bashrc
Proximo

36

সেড ইন, আপনি সহজে আউটপুট স্ট্রিমে নতুন লাইন যোগ করতে পারবেন না। আপনার একটি ধারাবাহিকতা রেখাটি ব্যবহার করা দরকার যা বিশ্রী, তবে এটি কার্যকর:

$ sed 's/regexp/\
&/'

উদাহরণ:

$ echo foo | sed 's/.*/\
&/'

foo

বিশদ জন্য এখানে দেখুন । আপনি যদি কিছুটা কম বিশ্রী কিছু চান তবে আপনি perl -peম্যাচের গ্রুপগুলির সাথে সেডের পরিবর্তে ব্যবহার করার চেষ্টা করতে পারেন :

$ echo foo | perl -pe 's/(.*)/\n$1/'

foo

$1 নিয়মিত প্রকাশের প্রথম মিলিত গোষ্ঠীকে বোঝায়, যেখানে গোষ্ঠীগুলি প্রথম বন্ধনীতে রয়েছে।


আপনি কেন বলছেন যে আপনি নতুন লাইন যোগ করতে পারবেন না? আপনি কেবল 's / regexp / & \ n / g' করতে পারেন এটি
অ্যান্ড্রেস

2
এটি ম্যাকের জন্য নতুন লাইন সন্নিবেশ করানোর জন্য সবচেয়ে কম হ্যাকিংয়ের মতো জিনিস (\ n ম্যাকের সাথে কাজ করে না)
পাইলিনাক্স

পার্ল সংস্করণ স্থান সম্পাদনা করতে করতে সংশোধন করা যেতে পারেperl -pi -e 's/(.*)/\n$1/' foo
এপোনামাস

2
@ এন্ড্রেস: (বেশিরভাগ ক্ষেত্রে) পসিক্স-ফিচার-কেবলমাত্র সেড বাস্তবায়ন যেমন বিএসডি সংস্করণ যা ওএস এক্স এর সাথে আসে সেগুলি কোনও sফাংশন কলের প্রতিস্থাপন অংশে কন্ট্রোল-চরিত্রের পালানোর ক্রমগুলিকে সমর্থন করে না ( জিএনইউ শেড বাস্তবায়নের বিপরীতে ) । উপরের উত্তর দুটি বাস্তবায়ন নিয়ে কাজ করে; সমস্ত পার্থক্য একটি সংক্ষিপ্তসার জন্য, এখানে দেখুন
mklement0

29

আমার ম্যাকে, নিম্নলিখিতগুলি নতুন লাইনের পরিবর্তে একটি একক 'এন' সন্নিবেশ করায়:

sed 's/regexp/\n&/g'

এটি নতুন লাইনের সাথে প্রতিস্থাপন করে:

sed "s/regexp/\\`echo -e '\n\r'`/g"

আমি ইনলাইন সম্পাদনা করছিলাম sed -i '' -e ...এবং একটি ^Mক্যারেট এম (সিটিআরএল + এম) ফাইলটিতে লিখিত হওয়ার সাথে সমস্যা হচ্ছিল । আমি একই প্যারাম দিয়ে পার্ল ব্যবহার করে শেষ করেছি।
স্টিভ টাবার

2
দ্বিতীয় কোডটি একটি বিশেষ নতুন লাইন কোড এলএফ সিআর (এমএস-ডস সিআর এলএফের বিপরীত) প্রবেশ করায় এই বিষয়ে সচেতন হন! ইউনিক্সের মতো ওএস এবং ম্যাক ওএস এক্স উভয়ই কেবল এলএফ ( \n) ব্যবহার করে ।
পাবুক

আমার ছদ্মবেশ প্রকাশে অন্য কিছু হ'ল এতটা অসুখী হচ্ছিল (এটি echo...নতুন এবং লাইন ছাড়া ভাল কাজ করা সত্ত্বেও ) আমি সবেমাত্র এইভাবেই করেছি।
আহমেদ ফসিহ

1
বা সহজভাবে: sed "s/regexp/`echo`/g"- এটি এলএফ-সিআর পরিবর্তে একক এলএফ উত্পাদন করবে
মোজুবা

2
@ মোজুবা: না: খালি স্ট্রিংয়ের`echo` ফল হবে , কারণ কমান্ড প্রতিস্থাপনগুলি সবগুলি নতুন লেলাইনকে অবিচ্ছিন্নভাবে ছাঁটাই করে দেয়। একটি একক নতুন লাইন সরাসরি sertোকাতে কমান্ড বিকল্প ব্যবহার করার কোনও উপায় নেই (এবং সন্নিবেশ - অর্থাত্ একটি অতিরিক্ত সিআর - একটি ভয়ঙ্কর ধারণা)। \n\r
mklement0

15
echo one,two,three | sed 's/,/\
/g'

1
+1 পুরোপুরি এবং বেশ
দৃight়

2
এই উত্তরটি আসলে একটি হয় কিন্তু একটি বদলে সমাধান ব্যাশ সমাধান। যে কোনও কিছু $'\n'যেমন কনস্ট্রাক্টস ব্যবহার করে তা নতুন লাইন তৈরির জন্য শেলের উপর নির্ভর করে। এই জাতীয় সমাধানগুলি পোর্টেবল নাও হতে পারে। এটা হল. অবশ্য এটি ২০০৯ সাল থেকে টেগামলিনের উত্তরের দ্বিতীয় উদাহরণটিরও একটি নকল।
ঘোটি

10

এই ক্ষেত্রে, আমি সেড ব্যবহার করি না। আমি ট্র ব্যবহার করি

cat Somefile |tr ',' '\012' 

এটি কমা নেয় এবং এটি গাড়ীর ফেরতের সাথে প্রতিস্থাপন করে।


1
আমি cat Somefile | tr ',' '\n'এটিতেও কাজ করে দেখলাম: ওয়াইএমএমভি
এলএস

9

পুরো পার্ল নিয়মিত এক্সপ্রেশন সাপোর্ট (যা আপনি শেডের সাথে যা পান তার চেয়ে অনেক বেশি শক্তিশালী) এর সুবিধা নিয়ে আপনি সেডের মতো পার্ল ওয়ান-লাইনার ব্যবহার করতে পারেন । * নিক্স প্ল্যাটফর্মগুলিতেও খুব কম পার্থক্য রয়েছে - পার্লটি সাধারণত পার্ল। সুতরাং আপনি কীভাবে আপনার নির্দিষ্ট সিস্টেমের সেডের সংস্করণটি চান তা করতে পারে তা নিয়ে আপনি দুশ্চিন্তা বন্ধ করতে পারেন।

এই ক্ষেত্রে, আপনি করতে পারেন

perl -pe 's/(regex)/\n$1/'

-pe পার্লকে "এক্সিকিউট এবং প্রিন্ট" লুপে রাখে, অনেকটা সিডের অপারেশনের সাধারণ মোডের মতো।

' শেল হস্তক্ষেপ করবে না তাই অন্য সব কিছু উদ্ধৃত করে

()রেজেক্সকে ঘিরে একটি গ্রুপিং অপারেটর। $1প্রতিস্থাপনের ডানদিকে এই পেরেনগুলির মধ্যে যা কিছু মিলেছে তা মুদ্রণ করে।

অবশেষে, \nএকটি নতুন লাইন।

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

\(\d\d\d\)\d\d\d-\d\d\d\d

\(বা \)আক্ষরিক প্যারেনের সাথে \dমেলে এবং একটি অঙ্কের সাথে মেলে।

উত্তম:

\(\d{3}\)\d{3}-\d{4}

আমি কল্পনা করেছি আপনি ব্র্যাকের সংখ্যাগুলি কী করছে তা নির্ধারণ করতে পারেন।

অতিরিক্ত হিসাবে, আপনি / আপনার রেগেক্সের জন্য ছাড়াও ডেলিফিটর ব্যবহার করতে পারেন। সুতরাং আপনার যদি মিলের প্রয়োজন হয় / আপনার এড়াতে হবে না। নীচের যে কোনওটি আমার উত্তরের শুরুতে রেজেক্সের সমতুল্য। তত্ত্ব অনুসারে আপনি মান / মানগুলির জন্য যে কোনও অক্ষরকে প্রতিস্থাপন করতে পারেন ।

perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'

একটি দম্পতি চূড়ান্ত চিন্তা।

একইভাবে ব্যবহারের -neপরিবর্তে ব্যবহার করে -pe, তবে শেষের দিকে স্বয়ংক্রিয়ভাবে মুদ্রণ হয় না। আপনি নিজের মুদ্রণ করতে চাইলে এটি কার্যকর হতে পারে। উদাহরণস্বরূপ, এখানে একটি গ্রেপ-অ্যালাইক ( m/foobar/এটি একটি রিজেক্স ম্যাচ):

perl -ne 'if (m/foobar/) {print}'

যদি আপনি নিউলাইনগুলি সমস্যাজনক হিসাবে দেখেন এবং আপনি এটি যাদুতে আপনার জন্য পরিচালনা করতে চান তবে যোগ করুন -l। যদিও নতুন লাইনের সাথে কাজ করছিলেন ওপি, তার পক্ষে কার্যকর নয়।

বোনাস টিপ - আপনার যদি পিসিআর প্যাকেজ ইনস্টল করা থাকে তবে এটি আসে pcregrep, যা পুরো পার্ল-সামঞ্জস্যপূর্ণ রেজিক্সগুলি ব্যবহার করে।


4

হুম, সবেমাত্র পলাতকৃত নিউলাইনগুলি আরও সাম্প্রতিক সংস্করণগুলিতে কাজ করছে বলে মনে হচ্ছে sed(আমার কাছে জিএনইউ ৪.২.১ আছে),

dev:~/pg/services/places> echo 'foobar' | sed -r 's/(bar)/\n\1/;'
foo
bar

1
যেমনটি উল্লেখ করা হয়েছে, এটি জিএনইউ সেডের বিভিন্ন সংস্করণে কাজ করে তবে ম্যাকোএসের সাথে অন্তর্ভুক্ত সেডটি নয়।
এলএস

4
echo pattern | sed -E -e $'s/^(pattern)/\\\n\\1/'

()সমর্থন সঙ্গে এল ক্যাপ্টেন উপর সূক্ষ্ম কাজ


এটি দুর্দান্ত কাজ করেছে এবং এমনকি আপনি নিজের উদ্দেশ্যটির জন্য বিশেষজ্ঞ হতে পরীক্ষা এবং এক্সট্রোপোলেট করার জন্য একটি সম্পূর্ণ কমান্ড দিয়েছেন give চমৎকার কাজ!
jxramos

3

লিনাক্সে আউটপুট স্ট্রিমে একটি নতুন লাইন সন্নিবেশ করানোর জন্য, আমি ব্যবহার করেছি:

sed -i "s/def/abc\\\ndef/" file1

কোথায় file1ছিল:

def

সেড ইন-প্লেস রিপ্লেসমেন্টের আগে এবং:

abc
def

পরে সেড ইন-প্লেস প্রতিস্থাপন। দয়া করে ব্যবহার নোট করুন \\\n। যদি নিদর্শনগুলির "ভিতরে থাকে তবে ব্যবহার করে পালাতে হবে \"


আমার জন্য উপরের কোডটি কাজ করে না। এলএফ এর পরিবর্তে sedসন্নিবেশ করায় \nকারণ এটি \\nশেল থেকে প্যারামিটারে আসে। --- এই কোড কাজ করে: sed -i "s/def/abc\ndef/" file1। --- GNU sed version 4.2.1, GNU bash, version 4.1.2(1) / 4.2.25(1)(CentOS প্রকাশ 6.4 / উবুন্টু 12.04.3)।
পাবউক

2

সেডে আপনি "\ 1", "\ 2", .... দিয়ে আপনার প্যাটার্নগুলিতে গ্রুপগুলি উল্লেখ করতে পারেন, সুতরাং আপনি যে প্যাটার্নটি সন্ধান করছেন সেটি যদি "প্যাটার্ন" হয় এবং আপনি এর সামনে "আগে" সন্নিবেশ করতে চান , আপনি ব্যবহার করতে পারেন, পালানো স্যান

sed 's/(PATTERN)/BEFORE\1/g'

অর্থাত

  sed 's/\(PATTERN\)/BEFORE\1/g'

সবেমাত্র করেছেন: টেস্টফাইলে সামগ্রী = "এবিসি এবিসি এবিসি"। রান "সেড / এস (BC (এবিসি \) / \ n \ 1 / জি 'টেস্টফাইলে, নতুন লাইন পেয়েছে the প্যাটার্ন, তারপরে গ্রুপের মিলটি পরীক্ষা করুন, তারপরে নতুন লাইনের চেকিং যুক্ত করুন
স্টিভ বি।

আমি ঠিক এটি চেষ্টা করেছি এবং "এনএবিসি এনএবিসি এনএবিসি 'পেয়েছি। আপনি কি শেডের অন্য কোনও সংস্করণ ব্যবহার করছেন?
টড গাম্বলিন

শেল পলায়ন সম্ভবত টেগাম্বলিনের প্রচেষ্টার পথে চলেছে। স্টিভ বি এর মতো একক উদ্ধৃতিতে সম্পূর্ণ সেড যুক্তি স্থাপন করা ঠিক করা উচিত should সম্ভবত যে সেডের বিভিন্ন সংস্করণগুলি নিউলাইনের জন্য \ n বুঝতে পারে না।
ড্যান প্রিটস

2

আপনি -vপ্যাটার্নটি সরবরাহ করে, এডকেও এটি করতে পারেন :

awk -v patt="pattern" '$0 ~ patt {gsub(patt, "\n"patt)}1' file

কোনও লাইনে প্রদত্ত নিদর্শন রয়েছে কিনা তা এটি পরীক্ষা করে। যদি তা হয় তবে এটি এটির শুরুতে একটি নতুন লাইন যুক্ত করে।

একটি প্রাথমিক উদাহরণ দেখুন:

$ cat file
hello
this is some pattern and we are going ahead
bye!
$ awk -v patt="pattern" '$0 ~ patt {gsub(patt, "\n"patt)}1' file
hello
this is some 
pattern and we are going ahead
bye!

নোট করুন এটি একটি লাইনে সমস্ত নিদর্শনগুলিকে প্রভাবিত করবে:

$ cat file
this pattern is some pattern and we are going ahead
$ awk -v patt="pattern" '$0 ~ patt {gsub(patt, "\n"patt)}1' d
this 
pattern is some 
pattern and we are going ahead

1
1 এতে কী করে?
হোয়াটহাইটসন

1
@ কিটাহিটসন অওকে 1শর্টহ্যান্ড হিসাবে ব্যবহৃত হয় {print $0}। কারণটি হ'ল সত্য যেটির কাছে মূল্যায়ন করে এমন কোনও শর্ত আউকের ডিফল্ট ক্রিয়াকে ট্রিগার করে, যা বর্তমান রেকর্ডটি মুদ্রণ করে।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

1

এটি আমার জন্য ম্যাকের কাজ করে

sed -i.bak -e 's/regex/xregex/g' input.txt sed -i.bak -e 's/qregex/\'$'\nregex/g' input.txt

ডোনো কিনা এটি নিখুঁত ...


1

এই প্রশ্নের সমস্ত উত্তর পড়ার পরে, এটি এখনও আমাকে নীচের উদাহরণ লিপিতে সঠিক বাক্য গঠন করার জন্য অনেক চেষ্টা করেছে:

#!/bin/bash
# script: add_domain
# using fixed values instead of command line parameters $1, $2
# to show typical variable values in this example
ipaddr="127.0.0.1"
domain="example.com"
# no need to escape $ipaddr and $domain values if we use separate quotes.
sudo sed -i '$a \\n'"$ipaddr www.$domain $domain" /etc/hosts

স্ক্রিপ্টটি \nএকটি একক sedকমান্ড ব্যবহার করে কোনও ফাইলের শেষের দিকে পাঠ্যর অন্য একটি লাইন অনুসরণ করে একটি নতুন লাইন যুক্ত করে ।


1
sed -e 's/regexp/\0\n/g'

\ 0 নাল, সুতরাং আপনার এক্সপ্রেশনটি নাল (কোনও কিছুই নয়) দিয়ে প্রতিস্থাপন করা হবে এবং তারপরে ...
\ n নতুন লাইন

ইউনিক্সের কিছু স্বাদে কাজ করে না তবে আমি মনে করি এটিই আপনার সমস্যার সমাধান।

echo "Hello" | sed -e 's/Hello/\0\ntmow/g'
Hello
tmow

0

রেড হ্যাটে vi তে আমি কেবল the r চরিত্রটি ব্যবহার করে গাড়িবহর রিটার্ন সন্নিবেশ করতে সক্ষম হয়েছি। আমি বিশ্বাস করি যে এটি অভ্যন্তরীণভাবে 'সেড' এর পরিবর্তে 'প্রাক্তন' সম্পাদন করে তবে এটি একই রকম এবং ভি প্লে কোড প্যাচের মতো বাল্ক সম্পাদনা করার অন্য উপায় হতে পারে। উদাহরণ স্বরূপ. আমি একটি অনুসন্ধান শব্দের আশেপাশে একটি আইএফ স্টেটমেন্ট দিয়ে ঘিরে রয়েছি যা ধনুর্বন্ধনী পরে গাড়ীর ফেরত জোর দেয়:

:.,$s/\(my_function(.*)\)/if(!skip_option){\r\t\1\r\t}/

নোট করুন যে জিনিসগুলিকে আরও ভাল করে সাজানোর জন্য আমার কিছু ট্যাব sertোকানো ছিল।

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