প্রতিস্থাপনের স্ট্রিংটি ব্যাখ্যা করা থেকে সেডকে প্রতিরোধ করার কোনও উপায় আছে কি? [বন্ধ]


16

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

উদা:

VAR="hi/"

sed "s/KEYWORD/$VAR/g" somefile

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


আপনি যদি বিশেষ চরিত্রগুলি রাখতে চান sedএবং সেগুলি বিশেষ না হন তবে কেবল ব্যাকস্ল্যাশ এড়িয়ে যান। VAR='hi\/'এ জাতীয় কোনও সমস্যা দেয় না
ওয়াইল্ডকার্ড

6
সব ডাউনভোটস কেন? এটি আমার কাছে একেবারে যুক্তিসঙ্গত প্রশ্ন বলে মনে হচ্ছে
রোয়াইমা

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

উত্তর:


5

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

export VAR='hi/'
perl -p -e 's/KEYWORD/$ENV{VAR}/g' somefile

আপনি যদি ভেরিয়েবলটি যে কোনও জায়গায় রফতানি করতে না চান, তবে কেবল সেই প্রক্রিয়াটির জন্য এটি সরবরাহ করুন:

PATTERN="$VAR" perl -p -e 's/KEYWORD/$ENV{PATTERN}/g' somefile

মনে রাখবেন যে পার্লের নিয়মিত প্রকাশের বাক্য গঠন ডিফল্টভাবে সেডের থেকে কিছুটা আলাদা।


এটি খুব আশাব্যঞ্জক বলে মনে হয়েছিল, তবে এটি পরীক্ষা করার সময় আমি একটি "তর্ক তালিকা খুব দীর্ঘ" ত্রুটি পেয়েছি কারণ আমার প্রতিস্থাপনের স্ট্রিংটি অনেক দীর্ঘ, যা বোঝায় - এই পদ্ধতিটি ব্যবহার করে, আমরা যে আর্গুমেন্ট দিয়েছি তার অংশ হিসাবে পুরো প্রতিস্থাপন স্ট্রিংটি ব্যবহার করছি perl, যাতে এটি কত দীর্ঘ হতে পারে একটি সীমা আছে।
তালু

1
না, এটি PATTERN পরিবেশে পরিবর্তনশীল হবে , যুক্তি নয়। যাইহোক, এই ত্রুটিটি E2BIGহ'ল, যদি আপনি ব্যবহার করেন তবে আপনি সমানভাবে পাবেন sed
অ্যান্টি হাপালা

4

সেখানে প্রতিস্থাপন অংশে মাত্র 4 বিশেষ অক্ষর আছেন: \, &, NEWLINE এবং বিভেদক ( সুত্র )

$ VAR='abc/def&ghi\foo
next line'

$ repl=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$VAR")

$ echo "$repl"
abc\/def\&ghi\\foo\
next line

$ echo ZYX | sed "s/Y/$repl/g"
Zabc/def&ghi\foo
next lineX

এটি অ্যান্টির সমাধানের মতো একই সমস্যা রয়েছে - প্রতিস্থাপনের স্ট্রিং যদি একটি নির্দিষ্ট দৈর্ঘ্যের অতীত হয়, আপনি একটি "তর্ক তালিকা খুব দীর্ঘ" ত্রুটি পান। এছাড়াও, প্রতিস্থাপনের স্ট্রিংয়ে যদি [[','] ',' * ','। ', এবং এই জাতীয় অন্যান্য অক্ষর থাকে? সেড কি সত্যিই তাদের ব্যাখ্যা করবে না?
তাল

প্রতিস্থাপন পাশ s///হয় না একটি রেগুলার এক্সপ্রেশন, আসলেই (ব্যাকস্ল্যাশ-বেরিয়ে এবং ছাড়া শুধু একটি স্ট্রিং এর &)। যদি প্রতিস্থাপনের স্ট্রিংটি এত দীর্ঘ হয় তবে শেল ওয়ান-লাইনারটি আপনার সমাধান নয়।
গ্লেন জ্যাকম্যান

একটি খুব দরকারী তালিকা যদি উদাহরণস্বরূপ, আপনার প্রতিস্থাপনের স্ট্রিংটি বেস 64 এনকোডড পাঠ্য হয় (যেমন, কোনও SHA256 কী দ্বারা কোনও স্থানধারককে প্রতিস্থাপন করা)) তারপরে এটি নিয়ে চিন্তিত হওয়ার জন্য সীমাবদ্ধ মাত্র।
রাফারি

2

খুব সহজ সমাধান যা এখনও বহুমুখী ভেরিয়েবলের মানগুলি সঠিকভাবে পরিচালনা করতে পারে তা হ'ল একটি প্রিন্টিং অক্ষরকে sedপরিবর্তিত কমান্ডের জন্য ডিলিমিটার হিসাবে ব্যবহার করা ।

ইন viআপনাকে টাইপ করা জন্য Ctrl-V দ্বারা কোনো নিয়ন্ত্রণ চরিত্র বাঁচা যায় (আরো সাধারণভাবে হিসাবে লিখিত ^V)। সুতরাং আপনি যদি কিছু নিয়ন্ত্রণ অক্ষর ব্যবহার ^Aকরেন (আমি প্রায়শই এই ক্ষেত্রে ডিলিমিটার হিসাবে ব্যবহার করি ) তবে আপনার sedকমান্ডটি কেবল তখনই ভেঙে যাবে যদি সেই অ-প্রিন্টিং চরিত্রটি আপনি যে পরিবর্তনশীলটিতে ফেলে আসছেন তাতে উপস্থিত থাকে।

সুতরাং আপনি টাইপ করবেন "s^V^AKEYWORD^V^A$VAR^V^Ag"এবং যা পাবেন তা ( viযেমন) দেখতে পাবেন:

sed "s^AKEYWORD^A$VAR^Ag" somefile

এটি মুদ্রণবিহীন $VARঅক্ষর না রাখার সময় পর্যন্ত কাজ করবে ^A- যার সম্ভাবনা খুব বেশি।


অবশ্যই, যদি আপনি ব্যবহারকারীর ইনপুটটির মান দিয়ে যাচ্ছেন $VAR, তবে সমস্ত বেট বন্ধ হয়ে গেছে এবং আপনি গড় ব্যবহারকারীর পক্ষে টাইপ করা শক্ত অক্ষরের উপর নির্ভর করে নিয়ন্ত্রণের অক্ষরগুলির উপর নির্ভর করার চেয়ে নিজের ইনপুটটি ভালভাবে স্যানিটাইজ করতে চান।


যদিও ডিলিমিটার স্ট্রিংয়ের চেয়ে সচেতন হওয়ার মতো আরও কিছু আছে। উদাহরণস্বরূপ, &প্রতিস্থাপনের স্ট্রিংয়ে উপস্থিত থাকার অর্থ "মিলিত পুরো পাঠ্য"। উদাহরণস্বরূপ, s/stu../my&/"স্টাফ" কে "মাইস্টফ", "স্টং" "মাইস্টং" এর সাথে প্রতিস্থাপন করবে ইত্যাদি। সুতরাং যদি আপনার পরিবর্তনের স্ট্রিং হিসাবে ভেরিয়েবলের কোনও অক্ষর থাকে তবে আপনি আক্ষরিক ব্যবহার করতে চান কেবলমাত্র ভেরিয়েবলের মান, তারপরে পরিবর্তনের স্ট্রিং হিসাবে ভেরিয়েবলটি ব্যবহার করার আগে আপনার কিছু ডেটা স্যানিটাইজিং করতে হবে sed। (তথ্যের সাথে স্যানিটাইজিংও করা যেতে পারে sed, তবে))


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

1
@ টাল, যদি আপনার প্রতিস্থাপনের স্ট্রিং "100 পৃষ্ঠাগুলি দীর্ঘ" হয় তবে আপনি অন্য মন্তব্যে উল্লেখ করেছেন ... আপনি খুব সহজেই এটিকে একটি "সাধারণ" ব্যবহারের ক্ষেত্রে বলতে পারেন। এখানে উত্তরটি পার্ল, যাইহোক - আমি কেবল পার্ল শিখিনি। জটিলতা এখানে সত্য যে আপনি একটি যে কোন অবাধ ইনপুট অনুমতি দিতে চান থেকে আসে প্রতিস্থাপন স্ট্রিং একটি Regex
ওয়াইল্ডকার্ড

আপনি ব্যবহার করতে পারেন এমন আরও অনেকগুলি সমাধান রয়েছে যার মধ্যে অনেকগুলি খুব সাধারণ। উদাহরণস্বরূপ, যদি আপনার প্রতিস্থাপনের স্ট্রিংটি আসলে লাইন ভিত্তিক হয় এবং কোনও লাইনের মাঝখানে beোকানো প্রয়োজন না হয় তবে sedএর insert কমান্ডটি ব্যবহার করুন । কিন্তু sedজটিল উপায়ে লেখার সুবিশাল পরিমাণে প্রক্রিয়াকরণের জন্য একটি ভাল টুল নয়। কীভাবে এটি করবেন তা দেখিয়ে আমি আরও একটি উত্তর পোস্ট করব awk
ওয়াইল্ডকার্ড

1

আপনি এর পরিবর্তে একটি ,বা একটি ব্যবহার করতে পারেন |এবং এটি এটি পৃথককারী হিসাবে গ্রহণ করবে এবং প্রযুক্তিগতভাবে আপনি যে কোনও কিছু ব্যবহার করতে পারেন

ম্যান পৃষ্ঠা থেকে

\cregexpc
           Match lines matching the regular expression regexp.  The  c  may
      be any character.

আপনি দেখতে পাচ্ছেন যে আপনার বিভাজকের শুরুতে আপনার প্রথমে একটি দিয়ে শুরু করা উচিত, তারপরে আপনি এটিকে পৃথককারী হিসাবে ব্যবহার করতে পারেন।

ডকুমেন্টেশন থেকে http://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022- কম্যান্ড :

The / characters may be uniformly replaced by any other single character 
within any given s command.

The / character (or whatever other character is used in its stead) can appear in 
the regexp or replacement only if it is preceded by a \ character.

উদাহরণ:

sed -e 'somevar|s|foo|bar|'
echo "Hello all" | sed "s_all_user_"
echo "Hello all" | sed "s,all,user,"

echo "Hello/ World" | sed "s,Hello/,Neo,"


আপনি প্রতিস্থাপনের স্ট্রিংয়ে একটি একক, নির্দিষ্ট অক্ষর ব্যবহারের অনুমতি দেওয়ার বিষয়ে কথা বলছেন - এই ক্ষেত্রে, "/"। আমি প্রতিস্থাপনের স্ট্রিংটি পুরোপুরি ব্যাখ্যা করার চেষ্টা থেকে বাধা দেওয়ার বিষয়ে কথা বলছি। আপনি কোন অক্ষর ব্যবহার করবেন না ("/", ",", "|" ইত্যাদি) আপনি সর্বদা সেই চরিত্রটি প্রতিস্থাপনের স্ট্রিংয়ে পপ আপ করার ঝুঁকি নিয়ে থাকেন। এছাড়াও, প্রাথমিক চরিত্রটি কেবল বিশেষ চরিত্র নয় যা সেড যত্ন করে, তাই না?
তালু

@ টাল না এটি পরিবর্তে কিছু নিতে পারে না /এবং এটি /খুশির সাথে উপেক্ষা করবে যেমন আমি ঠিক দেখিয়েছি .. আসলে, আপনি এমনকি এটি অনুসন্ধান করতে এবং এটি একটি স্ট্রিংতে প্রতিস্থাপন করতে পারেন >>> আমি একটি উদাহরণ দিয়ে সম্পাদনা করেছি >>> এগুলি
স্টাফগুলি

@ টাল আপনি এটিকে ব্যাখ্যা থেকে আটকাতে চান কেন? আমি বলতে চাইছি যে sedপ্রথম জায়গায় ব্যবহার করা হচ্ছে , আপনার প্রকল্পটি কী?
ব্যবহারকারী 3566929

আমার কেবল একটি স্ট্রিং সহ একটি কীওয়ার্ড প্রতিস্থাপন করা দরকার। লিনাক্সে এটি করার জন্য সেডটি খুব সাধারণ উপায় বলে মনে হচ্ছে। স্ট্রিংটি 100 পৃষ্ঠার দীর্ঘ হতে পারে। আমি স্ট্রিংটি স্যানিটাইজ করার চেষ্টা করতে চাই না যাতে এটি পড়ার সময় সেডটি বেরোয় না - আমি চাই এটি স্ট্রিংয়ের কোনও অক্ষর পরিচালনা করতে সক্ষম হবে এবং "হ্যান্ডেল" দ্বারা, আমি বলতে চাইছি যাদু আবিষ্কার করার চেষ্টা না করা মধ্যে অর্থ।
তাল

1
@Tal, bashহয় না স্ট্রিং ম্যানিপুলেশন জন্য। মোটেও, আদৌ, আদৌ। এটি ফাইল হেরফের এবং কমান্ড সমন্বয়ের জন্য । এটি স্ট্রিংগুলির জন্য কিছু কার্যকর কার্যকারিতা তৈরির ক্ষেত্রে ঘটেছিল তবে এটি সীমাবদ্ধ এবং খুব দ্রুত নয় যদি আপনি এটি করছেন তবে এটিই মূল কাজ। "পাঠকে খারাপ অনুশীলন হিসাবে বিবেচনা করার জন্য শেল লুপ ব্যবহার করা কেন দেখুন ?" কিছু সরঞ্জাম যে হয় সবচেয়ে মৌলিক থেকে সবচেয়ে শক্তিশালী পাঠ্য প্রক্রিয়াকরণের জন্য পরিকল্পিত, যাতে: sed, awkএবং পার্ল।
ওয়াইল্ডকার্ড

1

যদি এটি লাইন-ভিত্তিক এবং প্রতিস্থাপনের জন্য কেবল একটি লাইন থাকে তবে আমি ফাইলটি প্রতিস্থাপন লাইনটি ব্যবহার করে নিজেই প্রিন্ট করার পরামর্শ দিচ্ছি printf, সেই প্রথম লাইনটি sed'র হোল্ড স্পেসে সঞ্চয় করে রাখা এবং এটি প্রয়োজনমতো ফেলে দিন। এইভাবে আপনাকে বিশেষ চরিত্রগুলি নিয়ে মোটেও চিন্তা করতে হবে না। (এখানে কেবল অনুমানটি হ'ল $VARকোনও নিউলাইন ছাড়াই পাঠ্যগুলির একক লাইন রয়েছে, যা আপনি ইতিমধ্যে মন্তব্যে বলেছিলেন)) নিউলাইনগুলি ব্যতীত, ভিএআর-তে কিছু থাকতে পারে এবং এটি নির্বিশেষে কাজ করবে।

VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'

printf '%s\n'$VARএকটি নতুন লাইন অনুসরণ করে, এর লিখিত সামগ্রী নির্বিশেষে আক্ষরিক স্ট্রিং হিসাবে সামগ্রীগুলি মুদ্রণ করবে । ( echoকিছু ক্ষেত্রে অন্যান্য কাজ করবে, উদাহরণস্বরূপ যদি $VARহাইফেন দিয়ে বিষয়বস্তুগুলি শুরু হয় — তবে এটি একটি বিকল্প পতাকা উত্তীর্ণ হিসাবে ব্যাখ্যা করা হবে echo))

ধনুর্বন্ধনী আউটপুট পূর্বে লিখুন করতে ব্যবহার করা হয় printfবিষয়বস্তু থেকে somefileযেমন প্রেরণ হচ্ছে sed। কোঁকড়ানো ধনুর্বন্ধনীকে নিজের দ্বারা পৃথক করা হোয়াইটস্পেস এখানে গুরুত্বপূর্ণ, যেমন সমাপ্তি কোঁকড়া ধনুর্বন্ধনী এর আগে সেমিকোলন।

1{h;d;};হিসাবে একটি sedকমান্ড-এর লেখাটি প্রথম লাইন সংরক্ষণ করবে sed'র হোল্ড স্থান , তারপর d(বরং এটি প্রিন্টিং বেশী) লাইন elete।

/KEYWORD/সমন্বিত সমস্ত লাইনে নিম্নলিখিত ক্রিয়াগুলি প্রয়োগ করে KEYWORD। ক্রিয়াটি হ'ল g, যা হোল্ড স্পেসের বিষয়বস্তুগুলি পায় এবং এটি প্যাটার্ন স্পেসের জায়গায় ফেলে দেয় other অন্য কথায়, পুরো বর্তমান লাইন। (এটি কেবল একটি রেখার অংশ প্রতিস্থাপনের জন্য নয় )) হোল্ড স্পেসটি খালি হয় না, উপায় দ্বারা, কেবল প্যাটার্ন স্পেসে অনুলিপি করে সেখানে যা আছে তা প্রতিস্থাপন করে।

যদি আপনি চাই প্রতি নোঙ্গর আপনার Regex তাই এটি একটি লাইন যা নিছক মেলে না হবে রয়েছে KEYWORD এর কিন্তু শুধুমাত্র একটি লাইন যেখানে লাইন কিন্তু KEYWORD এর উপর অন্য কিছুই নেই, লাইন নোঙ্গর (একটি শুরুতে যোগ ^) এবং লাইন নোঙ্গর শেষে ( $করা) আপনার রেজেক্স:

VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'

আপনার ভিএআর এক লাইন দীর্ঘ হলে দুর্দান্ত মনে হয়। আমি আসলে মন্তব্যে উল্লেখ করেছি যে ভিএআর "এক পৃষ্ঠার চেয়ে 100 পৃষ্ঠাগুলি দীর্ঘ হতে পারে"। বিভ্রান্তির জন্য দুঃখিত.
তালু

0

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

$ var='a/b/c';var="${var//\//\\/}";echo 'this is a test' | sed "s/i/$var/g"

আউটপুট

tha/b/cs a/b/cs a test

আপনি প্যারামিটার সম্প্রসারণটি আপনার এসড কমান্ডের মধ্যে সরাসরি রাখতে পারেন:

$ var='a/b/c';echo 'this is a test' | sed "s/i/${var//\//\\/}/g"

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

আরেকটি বিকল্প হ'ল এসড ব্যবহার না করে আপনার বিকল্পগুলি করতে আর্ক, পার্ল বা পাইথন বা সি প্রোগ্রামে লিখিত স্ক্রিপ্ট ব্যবহার করা।


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

import sys

#Get the keyword and replacement texts from the command line
keyword, replacement = sys.argv[1:]
for line in sys.stdin:
    #Strip any trailing whitespace
    line = line.rstrip()
    if line == keyword:
        line = replacement
    print(line)

এটি ইনপুট স্যানিটাইজ করার অন্য একটি উপায়, এবং এটিতে দুর্দান্ত কোনওটি নয়, কারণ এটি কেবল একটি নির্দিষ্ট অক্ষর ('/') পরিচালনা করে। ওয়াইল্ডকার্ড যেমন উল্লেখ করেছে, কেবলমাত্র ডিলিমিটার স্ট্রিংয়ের চেয়ে সচেতন হওয়ার মতো আরও অনেক কিছুই রয়েছে।
তালু

ফর্সা কল। উদাহরণস্বরূপ, প্রতিস্থাপন পাঠ্যে যদি কোনও ব্যাকস্ল্যাশ-পলাতক ক্রম থাকে তবে তাদের ব্যাখ্যা করা হবে, এটি পছন্দসই নয়। এর চারপাশের এক উপায় হ'ল সমস্যাযুক্ত চরগুলি (বা পুরো জিনিসটি) \x-স্টাইল অব্যাহতি ক্রমে রূপান্তর করা । বা এমন কোনও প্রোগ্রাম ব্যবহার করতে যা যথেচ্ছ ইনপুট পরিচালনা করতে পারে, যেমনটি আমি আমার শেষ অনুচ্ছেদে উল্লেখ করেছি।
প্রধানমন্ত্রী 2Ring

@ টাল: আমি আমার উত্তরে একটি সাধারণ পাইথনের উদাহরণ যুক্ত করব।
প্রধানমন্ত্রী 2 রিং

পাইথন স্ক্রিপ্টটি দুর্দান্ত কাজ করে এবং আমার ফাংশনটি ঠিক আরও দক্ষতার সাথে করে যা ঠিক তাই করে বলে মনে হচ্ছে। দুর্ভাগ্যক্রমে, যদি মূল স্ক্রিপ্টটি বাশ হয় (যেমনটি আমার ক্ষেত্রে রয়েছে), এটির জন্য গৌণ বাহ্যিক অজগর স্ক্রিপ্ট ব্যবহার করা দরকার।
তালু

-1

এইভাবেই আমি গিয়েছিলাম:

#Replaces a keyword with a long string
#
#This is normally done with sed, but sed
#tries to interpret the string you are
#replacing the keyword with too hard
#
#stdin - contents to look through
#Arg 1 - keyword to replace
#Arg 2 - what to replace keyword with
replace() {
        KEYWORD="$1"
        REPLACEMENT_STRING="$2"

        while IFS= read -r LINE
        do
                if [[ "$LINE" == "$KEYWORD" ]]
                then
                        printf "%s\n" "$REPLACEMENT_STRING"
                else
                        printf "%s\n" "$LINE"
                fi
        done < /dev/stdin
}

এটি আমার ক্ষেত্রে দুর্দান্ত কাজ করে কারণ আমার কীওয়ার্ডটি নিজেই এক লাইনে রয়েছে। কীওয়ার্ডটি অন্য পাঠ্যের সাথে একটি লাইনে থাকলে এটি কাজ করবে না।

আমি এখনও সত্যিই জানতে চাই যে এটি করার কোনও সহজ উপায় যদি আমার নিজের সমাধান কোডিংয়ের সাথে জড়িত না।


1
আপনি যদি বিশেষ চরিত্র এবং দৃust়তা সম্পর্কে সত্যিই চিন্তিত হন তবে আপনার মোটেও ব্যবহার echoকরা উচিত নয় । পরিবর্তে ব্যবহার printfকরুন। এবং শেল লুপে পাঠ্য প্রক্রিয়াকরণ করা একটি খারাপ ধারণা।
ওয়াইল্ডকার্ড

1
আপনি কীওয়ার্ডটি সর্বদা একটি সম্পূর্ণ লাইন হয়ে থাকবে এমন প্রশ্নে উল্লেখ করলে এটি সহায়ক হত। এফডাব্লুআইডাব্লু, বাশগুলি readবরং ধীর। এটি পাঠ্য ফাইল প্রসেসিং নয়, ইন্টারেক্টিভ ব্যবহারকারী ইনপুট প্রক্রিয়াজাতকরণের উদ্দেশ্যে meant এটি ধীরে ধীরে কারণ এটি স্টার চার্ট দ্বারা চারটি পড়ে প্রতিটি চরের জন্য একটি সিস্টেম কল করে।
প্রধানমন্ত্রী 2Ring

@ পিএম 2 রিং আমার প্রশ্নের মধ্যে উল্লেখ করা হয়নি যে কীওয়ার্ডটি তার নিজস্ব লাইনে রয়েছে কারণ আমি এমন উত্তর চাই না যা কেবলমাত্র এত সীমিত সংখ্যক ক্ষেত্রেই কাজ করে - আমি এমন কিছু চাই যা সহজেই কীওয়ার্ড যেখানেই কাজ করুক না কেন ছিল। আমি এও কখনও বলিনি যে আমার কোডটি দক্ষ - যদি এটি হয় তবে আমি বিকল্পের সন্ধান করতাম না ...
তাল

@ উইল্ডকার্ড যতক্ষণ না আমি কিছু মিস করছি, প্রিন্টফ একেবারে বিশেষ অক্ষরের ব্যাখ্যা দেয় এবং ডিফল্ট 'প্রতিধ্বনি' এর চেয়ে অনেক বেশি। printf "hi\n"প্রিন্টএফ echo "hi\n"প্রিন্ট করার সময় একটি নতুন লাইন প্রিন্ট করবে it
তাল

@ টাল, "ফ" এর মধ্যে printf"ফর্ম্যাট" রয়েছে - এটির প্রথম যুক্তি printfএকটি বিন্যাস নির্দিষ্টকরণকারক। যদি সেই নির্দিষ্টকরণকারীটি হয় %s\n, যার অর্থ "স্ট্রিং এর পরে নিউলাইন", পরবর্তী যুক্তির কোনও কিছুই ব্যাখ্যা বা অনুবাদ করা যাবে printf না । (শেলটি এখনও এটি ব্যাখ্যা করতে পারে; অবশ্যই এটি একটি আক্ষরিক স্ট্রিং হলে একক উদ্ধৃতিতে সর্বোত্তমভাবে স্টিক করুন, বা আপনি পরিবর্তনশীল প্রসারিত করতে চাইলে ডাবল উদ্ধৃতিগুলি ব্যবহার করতে পারেন।) আরও বিশদ ব্যবহারেরprintf জন্য আমার উত্তর দেখুন ।
ওয়াইল্ডকার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.