নিয়মিত প্রকাশ ছাড়া ** পাঠ্য ফাইলে প্রতিস্থাপন


68

প্রতিস্থাপনের সাথে আমার একটি পাঠ্য ফাইলের ভিতরে কিছু পাঠ্য স্থান নেওয়া দরকার। সাধারণত আমি এমন কিছু করতাম

sed -i 's/text/replacement/g' path/to/the/file

সমস্যাটি হ'ল উভয়ই textএবং replacementজটিল স্ট্রিং যা ড্যাশস, স্ল্যাশস, ব্ল্যাকস্ল্যাশেস, কোটস ইত্যাদি রয়েছে। যদি আমি textজিনিসটির অভ্যন্তরে সমস্ত প্রয়োজনীয় অক্ষরগুলি রক্ষা করি তবে তা দ্রুত অপঠনযোগ্য হয়ে যায়। অন্যদিকে আমার নিয়মিত অভিব্যক্তির শক্তি প্রয়োজন নেই: আমার কেবল পাঠ্যটি আক্ষরিক পরিবর্তে নেওয়া দরকার।

কিছু ব্যাশ কমান্ডের সাথে নিয়মিত এক্সপ্রেশন ব্যবহার না করে পাঠ্য প্রতিস্থাপনের কোনও উপায় আছে কি ?

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


বাশের মাধ্যমে এটি করা প্রয়োজনীয়? একটি সরল সমাধান হ'ল ওয়ার্ডে খোলা এবং একটি করাfind and replace all
আকাশ

17
@akash কারণ যেসব সিস্টেমগুলি bashসর্বদা মাইক্রোসফ্ট ওয়ার্ডের সাথে চালিত হয় ? ;) না মজা করছি. ওপি একটি রিমোট মেশিনে বা ফাইলগুলির একটি ব্যাচের জন্য এটি করতে চাইতে পারে।
slhck

@ এসএলএইচএইচএইচ :) আচ্ছা, আমি অনুমান করি জেডিটের একই বিকল্প থাকা উচিত
আকাশ

একটি বিকল্প হ'ল কোনও কিছুকে যথাযথভাবে পালিয়ে যাওয়ার আগে পালানো sed, যা সম্ভবত সমস্ত সুইচ এবং প্ল্যাটফর্মের পার্থক্য বিবেচনা করে নিরর্থক প্রচেষ্টা।
l0b0

উত্তর:


6

যখন আপনার নিয়মিত এক্সপ্রেশনগুলির শক্তি প্রয়োজন হয় না, তখন এটি ব্যবহার করবেন না। ওটা দারুন.
তবে, এটি আসলে কোনও নিয়মিত প্রকাশ নয়

sed 's|literal_pattern|replacement_string|g'

সুতরাং, যদি /আপনার সমস্যা হয় তবে ব্যবহার করুন |এবং আপনাকে প্রাক্তনটির হাত থেকে বাঁচার দরকার নেই।

PS: মন্তব্যগুলি সম্পর্কে, সেড অনুসন্ধানের প্যাটার্নের জন্য স্ট্রিংওভার স্ট্রিংয়ের স্ট্রিংয়ের উত্তরটি দেখুন ।


আপডেট: আপনি যদি পার্ল ব্যবহার করে ভাল হন \Qএবং এটির \Eমতো চেষ্টা
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrickকরুন, তবে এখানে একটি মন্তব্যে আরও শক্তিশালী পার্ল সিনট্যাক্সের সাথে অনুরূপ কৌশলটির পরামর্শ দিয়েছেন


আপনাকে ধন্যবাদ, আমি / এবং | এর মধ্যে পার্থক্য সম্পর্কে জানতাম না
Andrea

64
আমি নিশ্চিত এই উত্তর দরকারী নই ... মধ্যে একমাত্র পার্থক্য s|||এবং s///যে SEPERATOR চরিত্র ভিন্ন এবং যাতে হয় এক চরিত্র পলায়নের দরকার নেই। আপনি সমানভাবে করতে পারে s###। এখানে আসল ইস্যুটি হ'ল ওপিকে literal_pattern(যেটি আক্ষরিক নয় এবং রেজেক্স হিসাবে ব্যাখ্যা করা হবে) বিষয়বস্তুগুলি অবলম্বনের বিষয়ে চিন্তা করতে চায় না ।
বেনজ

15
এটি অন্যান্য বিশেষ অক্ষরের ব্যাখ্যা এড়াতে পারবে না। যদি 1234.*aaaআপনার সমাধানের সাথে অনুসন্ধান করা হয় তবে এটি উদ্দেশ্যটির চেয়ে অনেক বেশি মেলে 1234\.\*aaa
মাত্তেও

20
এই উত্তরটি গ্রহণ করা উচিত নয়
স্টিভেন লু

2
এটি পুরোপুরি বিন্দু মিস করে। মেলানো পাঠ্যটিতে যে কোনও বিড়ম্বনা থাকতে পারে। আমার ক্ষেত্রে এটি একটি এলোমেলো পাসওয়ার্ড। কীভাবে যায় তা আপনি জানেন
খ্রিস্টান বনজিওর্নো

13
export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file

এখানে এটিই একমাত্র 100% নিরাপদ সমাধান, কারণ:

  • এটি একটি স্ট্যাটিক সাবস্টেশন, একটি রেজিপ্স্প নয়, কোনও কিছু এড়ানোর দরকার নেই (এইভাবে ব্যবহারের চেয়ে উন্নত sed)
  • যদি আপনার স্ট্রিংটিতে }চর থাকে (তবে এটি একটি জমা দেওয়া পার্ল সমাধানের চেয়ে উন্নত) থাকে না
  • এটি কোনও চরিত্রের সাথে ভাঙবে না, কারণ ENV['FIND']এটি ব্যবহৃত হয়েছে, না $FIND। সঙ্গে $FINDবা আপনার পাঠ্য রুবি কোডে inlined, আপনি একটি বাক্য গঠন ত্রুটি আঘাত যদি আপনার স্ট্রিং একটি unescaped অন্তর্ভুক্ত পারে '

আমি ব্যবহার করতে হয়েছে export FIND='find this; export REPLACE='replace with this';যাতে আমার ব্যাশ স্ক্রিপ্টের মধ্যে ENV['FIND']এবং ENV['replace']প্রত্যাশিত মান ছিল। আমি একটি ফাইলে কিছু দীর্ঘ দীর্ঘ এনক্রিপ্ট হওয়া স্ট্রিংয়ের স্থানে ছিলাম। এটি ছিল মাত্র টিকিট।
ডিএমএফএল

এটি নির্ভরযোগ্য উত্তর কারণ এটি নির্ভরযোগ্য এবং রুবি সর্বব্যাপী। এই উত্তরের ভিত্তিতে আমি এখন এই শেল স্ক্রিপ্টটি ব্যবহার করি ।
loevborg

দুর্ভাগ্যক্রমে কাজ করে না যখন FIND এ একাধিক লাইন থাকে।
এড্রেলানোস

এফআইএনডিতে একাধিক লাইনের সাথে কাজ করা থেকে বিরত রাখতে পারে এমন কিছুই নেই। ডাবল উদ্ধৃত Use n ব্যবহার করুন।
20

7

replaceকমান্ড করব।

https://linux.die.net/man/1/replace

জায়গায় পরিবর্তন:

replace text replacement -- path/to/the/file

অবিচ্ছিন্নভাবে:

replace text replacement < path/to/the/file

উদাহরণ:

$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi

replaceকমান্ড মাইএসকিউএল বা MariaDB দিয়ে আসে।


3
অ্যাকাউন্টে প্রতিস্থাপনটি অবহিত করা হয় এবং ভবিষ্যতে এটি আপত্তিজনক নাও হতে পারে
Rogelio

1
পৃথিবীতে কেন এই জাতীয় প্রাথমিক আদেশটি একটি ডাটাবেস নিয়ে আসে?
মাস্টারসিল্লো

3
@ মাস্টারেক্সিলো আরও ভাল প্রশ্ন হতে পারে - আধুনিক অপারেটিং সিস্টেমের সাথে এ জাতীয় বেসিক কমান্ড আসে না কেন? ;-)
মার্ক থমসন


3

আমার পার্ল স্ক্রিপ্ট দেখুন। এটি নিয়মিত প্রকাশের স্পষ্ট বা স্পষ্ট ব্যবহার ছাড়াই আপনার যা প্রয়োজন ঠিক তা করে:

https://github.com/Samer-Al-iraqi/Linux-str_replace

str_replace Search Replace File # replace in File in place

STDIN | str_replace Search Replace # to STDOUT

খুব সহজ? এটি করার জন্য আমাকে পার্ল শিখতে হয়েছিল। কারণ আমার সত্যই এটি দরকার


2

আপনি আপনার নিদর্শনগুলি এড়িয়ে গিয়ে এটি করতে পারেন । এটার মত:

keyword_raw='1/2/3'
keyword_regexp="$(printf '%s' "$keyword_raw" | sed -e 's/[]\/$*.^|[]/\\&/g')"
# keyword_regexp is now '1\/2\/3'

replacement_raw='2/3/4'
replacement_regexp="$(printf '%s' "$replacement_raw" | sed -e 's/[\/&]/\\&/g')"
# replacement_regexp is now '2\/3\/4'

echo 'a/b/c/1/2/3/d/e/f' | sed -e "s/$keyword_regexp/$replacement_regexp/"
# the last command will print 'a/b/c/2/3/4/d/e/f'

এই সমাধানগুলির জন্য ক্রেডিটগুলি এখানে যায়: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern

দ্রষ্টব্য 1: এটি কেবল খালি নয় এমন কীওয়ার্ডগুলির জন্য কাজ করে। খালি কীওয়ার্ডগুলি শেড ( sed -e 's//replacement/') দ্বারা গৃহীত হয় না ।

দ্রষ্টব্য 2: দুর্ভাগ্যক্রমে, আমি এমন একটি জনপ্রিয় সরঞ্জাম জানি না যা সমস্যা সমাধানের জন্য regexp-s ব্যবহার করবে না। আপনি মরচে বা সি তে এই জাতীয় একটি সরঞ্জাম লিখতে পারেন তবে এটি ডিফল্টরূপে সেখানে নেই।


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

@ আইসক্রিমসওয়ার্ড আপনি কি আমার উত্তরটি প্রথম লাইনের নীচে পড়েছেন? স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে পালাতে পারে ।
ভাস্যনাভিকভ

1

আমি কয়েকটি অন্যান্য উত্তর একসাথে পাই এবং এটি নিয়ে এসেছি:

function unregex {
   # This is a function because dealing with quotes is a pain.
   # http://stackoverflow.com/a/2705678/120999
   sed -e 's/[]\/()$*.^|[]/\\&/g' <<< "$1"
}
function fsed {
   local find=$(unregex "$1")
   local replace=$(unregex "$2")
   shift 2
   # sed -i is only supported in GNU sed.
   #sed -i "s/$find/$replace/g" "$@"
   perl -p -i -e "s/$find/$replace/g" "$@"
}

নতুন লাইনের সাথে কাজ করে না। এছাড়াও নতুন লাইনের সাথে পালাতে সহায়তা করে না \n। কোন সমাধান?
adrelanos

1

আপনি পিএইচপি এর str_replace ব্যবহার করতে পারেন :

php -R 'echo str_replace("\|!£$%&/()=?^\"'\''","replace",$argn),PHP_EOL;'<input.txt >output.txt

দ্রষ্টব্য: যদিও আপনাকে এখনও একক উদ্ধৃতি 'এবং ডাবল উদ্ধৃতিগুলি এড়াতে হবে "


0

নোড.জেএস @ নওকারের সমতুল্য:

export FNAME='moo.txt'
export FIND='search'
export REPLACE='rpl'
node -e 'fs=require("fs");fs.readFile(process.env.FNAME,"utf8",(err,data)=>{if(err!=null)throw err;fs.writeFile(process.env.FNAME,data.replace(process.env.FIND,process.env.REPLACE),"utf8",e=>{if(e!=null)throw e;});});'

0

Heres আরও একটি "প্রায়" কাজের উপায়।

Vi বা vim ব্যবহার করুন।

এতে আপনার প্রতিস্থাপন সহ একটি পাঠ্য ফাইল তৈরি করুন:

:% sno / আমার সন্ধানের স্ট্রিং \\ "-: # 2; g ('। j'); \\"> / আমার রিপ্লেসমেন্টিং = \\ "ব্যাক) (ও: # 46; \\"> /
:এক্স

তারপরে কমান্ডলাইন থেকে vi বা vim কার্যকর করুন:

vi -S commandfile.txt path/to/the/file

:% sno হ'ল যাদু ছাড়াই অনুসন্ধান এবং প্রতিস্থাপনের জন্য vi কমান্ড।

/ আমার নির্বাচিত বিভাজক।

: x সংরক্ষণ করে এবং প্রস্থান করা vi।

আপনার ব্যাকস্ল্যাশ এড়াতে হবে 'forward' ফরোয়ার্ডস্ল্যাশ '/' উদাহরণস্বরূপ একটি প্রশ্ন চিহ্ন 'দিয়ে প্রতিস্থাপন করা যেতে পারে?' বা অন্য কিছু যা আপনার অনুসন্ধানে নেই বা প্রতিস্থাপনের স্ট্রিং, পাইপ '|' আমার জন্য কাজ করেনি।

সুত্র: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html

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