কমান্ড ব্যবহার করে কোনও ফাইলের মধ্যে পাঠ্য সন্ধান করুন এবং প্রতিস্থাপন করুন


647

কমান্ড লাইনটি ব্যবহার করে আমি কোনও পাঠ্য ফাইলে নির্দিষ্ট শব্দগুলি কীভাবে সন্ধান এবং প্রতিস্থাপন করতে পারি?


1
আপনার আগ্রহের মে github.com/lucio-martinez/rch :-)
লুসিও

উত্তর:


1053
sed -i 's/original/new/g' file.txt

ব্যাখ্যা:

  • sed = স্ট্রিম ইডিটর
  • -i = ইন-প্লেস (অর্থাত্ মূল ফাইলটিতে আবার সংরক্ষণ করুন)
  • কমান্ড স্ট্রিং:

    • s = বিকল্প কমান্ড
    • original = প্রতিস্থাপনের জন্য শব্দটি বর্ণনা করার একটি নিয়মিত প্রকাশ (বা কেবলমাত্র শব্দটি নিজেই)
    • new = এটির সাথে প্রতিস্থাপন করার পাঠ্য
    • g = গ্লোবাল (অর্থাত্ প্রথম স্থানটি নয়, সমস্ত প্রতিস্থাপন করুন)
  • file.txt ফাইলের নাম


3
@ আকিভা যদি আপনি আপনার অনুসন্ধানে রেজেক্স বিশেষ অক্ষরগুলি অন্তর্ভুক্ত করেন তবে sedতাদের সাথে মেলে। -rপরিবর্তে বর্ধিত আরই ব্যবহার করতে চাইলে একটি পতাকা যুক্ত করুন ।
cscarney

32
@ এমসিএক্সচেঞ্জ যদি এটি নির্দিষ্ট করে এমন /চরিত্রের সাথে মেলে যা আপনি প্রয়োজন হয় তবে আপনি অন্য কিছু চরিত্রকে পৃথককারী (উদাহরণস্বরূপ 's_old/text_new/text_g') হিসাবে ব্যবহার করতে পারেন । অন্যথায়, আপনি আক্ষরিক চরিত্রটি পেতে যেকোনটির \ আগে একটি $ * . [ \ ^রাখতে পারেন।
cscarney

3
@ ব্রায়ানজেড যতক্ষণ না ফাইল সিস্টেম সম্পর্কিত, সেডের আউটপুট একই নামের নতুন ফাইল। এটি সাধারণভাবে রিপোর্ট হওয়া বাগগুলির মধ্যে একটি যা বাগ নয়
স্কার্কের্নি

16
ওএসএক্স কমান্ডটি sed -i '.bak' 's/original/new/g' file.txtশূন্য দৈর্ঘ্যের এক্সটেনশান দিয়ে চালানো যেতে পারে sed -i '' 's/original/new/g' file.txtযা কোনও ব্যাকআপ তৈরি করে না।
কার্ক

19
MacOS ব্যবহারকারীদের -i -'র পরে'i 'যুক্ত করতে হবে -i ed.gs/2016/01/26/os-x-sed-inuthor-command-code এর প্যারামিটার হিসাবে যাতে ফাইলটি ওভাররাইট হয়ে যায়
জিওউইউজ

32

এটি করার বিভিন্ন উপায় রয়েছে। একটি ব্যবহার করছে sedএবং রেইগেক্স। এসইডি হ'ল পাঠ্য পরিশোধক ও রূপান্তরকরণের জন্য একটি স্ট্রিম সম্পাদক। একটি উদাহরণ নিম্নরূপ:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

পাইপগুলির চেয়ে আরও বোধগম্য < strinএবং এটির অন্য উপায় > strout!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog

6
নোট catইন cat file | sed '...'অপ্রয়োজনীয়। আপনি সরাসরি বলতে পারেন sed '...' file
ফেডরকিই

1
প্রকৃতপক্ষে এটি আরও কমানো যেতে পারে: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarlyফাইলটি ইয়ারলি গ্রহণ করবে এবং ব্যাকআপ তৈরির সময় স্থানটিতে দুটি পরিবর্তন করবে। ব্যবহার time bash -c "$COMMAND"এটা প্রস্তাব দেওয়া এই সংস্করণে একটি ~ 5 বার দ্রুততর সেই সময় হতে।
pbhj

23

এটি অর্জনের বিভিন্ন উপায় রয়েছে। স্ট্রিং প্রতিস্থাপনের মাধ্যমে কেউ কী অর্জন করার চেষ্টা করে তার জটিলতার উপর নির্ভর করে এবং ব্যবহারকারী যে সরঞ্জামের সাথে পরিচিত তার উপর নির্ভর করে কিছু পদ্ধতি অন্যদের চেয়ে বেশি পছন্দ করা যেতে পারে।

এই উত্তরে আমি সাধারণ input.txtফাইলটি ব্যবহার করছি , যা আপনি এখানে সরবরাহিত সমস্ত উদাহরণ পরীক্ষা করতে ব্যবহার করতে পারেন। ফাইল সামগ্রী:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

BASH

বাশটি আসলে পাঠ্য প্রক্রিয়াজাতকরণের জন্য নয়, তবে পরামিতি প্রসারণের মাধ্যমে সহজ প্রতিস্থাপনগুলি করা যেতে পারে , বিশেষত এখানে আমরা সাধারণ কাঠামো ব্যবহার করতে পারি ${parameter/old_string/new_string}

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

এই ছোট স্ক্রিপ্টটি স্থান প্রতিস্থাপন করে না, এর অর্থ আপনাকে নতুন পাঠ্যে নতুন ফাইলে সংরক্ষণ করতে হবে এবং পুরানো ফাইল থেকে মুক্তি দিতে হবে, বা mv new.txt old.txt

পার্শ্ব দ্রষ্টব্য: আপনি কেন আগ্রহী তা কেন while IFS= read -r ; do ... done < input.txtব্যবহার করা হয় তা মূলত শেল এর মাধ্যমে ফাইল লাইন এক এক করে পড়ার উপায়। দেখুন এই রেফারেন্সের জন্য।

awk

এডাব্লুকে, একটি পাঠ্য প্রক্রিয়াজাতকরণ ইউটিলিটি হওয়ায় এ জাতীয় কাজের জন্য উপযুক্ত। এটা সহজ প্রতিস্থাপন এবং আরো অনেক কিছু উন্নত উপর ভিত্তি করে বেশী কি করতে পারেন রেগুলার এক্সপ্রেশনের । এটি দুটি ফাংশন সরবরাহ করে: sub()এবং gsub()। প্রথমটি কেবলমাত্র প্রথম ঘটনাকেই প্রতিস্থাপন করে, যখন দ্বিতীয়টি - পুরো স্ট্রিংয়ের উপস্থিতিগুলিকে প্রতিস্থাপন করে। উদাহরণস্বরূপ, যদি আমাদের স্ট্রিং থাকে one potato two potatoতবে এটি ফলাফল হতে পারে:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 

এডাব্লুকে আর্গুমেন্ট হিসাবে একটি ইনপুট ফাইল নিতে পারে, তাই একই জিনিসগুলির সাথে input.txtকরা সহজ হবে:

awk '{sub(/blue/,"azure")}1' input.txt

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

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

SED

সেড একটি লাইন সম্পাদক। এটি নিয়মিত প্রকাশও ব্যবহার করে তবে সাধারণ বিকল্পগুলির জন্য এটি করা যথেষ্ট:

sed 's/blue/azure/' input.txt

এই সরঞ্জামটি সম্পর্কে যা ভাল তা হ'ল এটিতে স্থানের সম্পাদনা রয়েছে যা আপনি -iপতাকা দিয়ে সক্ষম করতে পারেন ।

পার্ল

পার্ল হ'ল আরেকটি সরঞ্জাম যা প্রায়শই পাঠ্য প্রক্রিয়াজাতকরণের জন্য ব্যবহৃত হয় তবে এটি সাধারণ উদ্দেশ্য ভাষা and এটি অন্যান্য ভাষা যেমন সি, সেড, অ্যাজক এবং অন্যান্য থেকে প্রচুর ধারণা / বৈশিষ্ট্য ধার করেছে orrow সাধারণ প্রতিস্থাপনটি তাই করা যেতে পারে:

perl -pe 's/blue/azure/' input.txt

সেডের মতো পার্লেরও -i পতাকা রয়েছে।

পাইথন

এই ভাষাটি অত্যন্ত বহুমুখী এবং এটি বিভিন্ন ধরণের অ্যাপ্লিকেশনগুলিতে ব্যবহৃত হয়। স্ট্রিংগুলির সাথে কাজ করার জন্য এটির অনেকগুলি ফাংশন রয়েছে, যার মধ্যে রয়েছে replace(), তাই আপনার মতো চলক থাকলে আপনি var="Hello World"করতে পারতেনvar.replace("Hello","Good Morning")

ফাইল পড়ার সহজ স্ট্রিং এবং স্ট্রিং এর প্রতিস্থাপন যেমন হবে:

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

পাইথনের সাথে আপনাকে নতুন ফাইলও আউটপুট করতে হবে যা আপনি স্ক্রিপ্টের মধ্যে থেকেও করতে পারেন। উদাহরণস্বরূপ, এখানে একটি সহজ:

#!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])

এই স্ক্রিপ্টটি input.txtকমান্ড-লাইন আর্গুমেন্ট হিসাবে কল করা উচিত। কমান্ড-লাইন আর্গুমেন্টের সাথে পাইথন স্ক্রিপ্টটি চালানোর জন্য সঠিক আদেশ command

 $ ./myscript.py input.txt

অথবা

$ python ./myscript.py input.txt

অবশ্যই, ./myscript.pyএটি আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরিতে রয়েছে এবং প্রথম উপায়ে নিশ্চিত করুন যে এটি নির্বাহযোগ্য সেট রয়েছে ensurechmod +x ./myscript.py

পাইথনের নিয়মিত এক্সপ্রেশনও থাকতে পারে, বিশেষত, reমডিউল রয়েছে, যার re.sub()ফাংশন রয়েছে, যা আরও উন্নত প্রতিস্থাপনের জন্য ব্যবহার করা যেতে পারে।


1
সুন্দর সংকলন! এখানে বর্ণিত আর একটি সম্ভাব্য উপায় হ'ল trইউনিক্স- এ কমান্ডটি ব্যবহার করা হচ্ছে
তাপজিৎ দে

1
@ তপাজিতডে হ্যাঁ, tr এটি একটি দুর্দান্ত সরঞ্জাম, তবে মনে রাখবেন যে এটি অক্ষরের সেটগুলি প্রতিস্থাপনের জন্য (উদাহরণস্বরূপ , tr abc cdeঅনুবাদ aকরতে হবে । এটি পুরো শব্দের প্রতিস্থাপনের সাথে বাcbdsedpython
সের্গি কোলোডিয়াজনি

22

আপনি এক্স মোডে ভিম ব্যবহার করতে পারেন:

ex -s -c '%s/OLD/NEW/g|x' file
  1. % সমস্ত লাইন নির্বাচন করুন

  2. s বিকল্প

  3. g প্রতিটি লাইনে সমস্ত দৃষ্টান্ত প্রতিস্থাপন করুন

  4. x পরিবর্তনগুলি করা হয়েছে (তাদের আছে) লিখে প্রস্থান করুন


21

অ্যাডকের জিএসব কমান্ডের মাধ্যমে,

awk '{gsub(/pattern/,"replacement")}' file

উদাহরণ:

awk '{gsub(/1/,"0");}' file

উপরের উদাহরণে, সমস্ত 1 এর কলাম যেখানেই থাকুক না কেন 0 এর দ্বারা প্রতিস্থাপিত হবে।


আপনি যদি কোনও নির্দিষ্ট কলামে প্রতিস্থাপন করতে চান, তবে এটির মতো করুন,

awk '{gsub(/pattern/,"replacement",column_number)}' file

উদাহরণ:

awk '{gsub(/1/,"0",$1);}' file

এটি প্রথম কলামে 0 দিয়ে 1 প্রতিস্থাপন করে।

পার্লের মাধ্যমে,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar

আমি এটি ম্যাকওএস টার্মিনালে ব্যবহার করেছি এবং এটি কিছুই করেনি ...
জিম

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

@ সালাথিয়েল জেনেস আপনি কী অর্জন করার চেষ্টা করছেন?
অবিনাশ রাজ

আমি এনভির inotifywaitঅধীনে ফাইলটি দেখছি sh, এবং সিএসভি ফর্ম্যাটে ডেটা প্রতিবেদন করছি (কারণ কাস্টম বিন্যাসটি বগি। আমি তখন বুঝতে পেরেছিলাম যে শেল স্ক্রিপ্টগুলিতে সিএসভি ডকুমেন্ট হ্যান্ডেল করার কোনও সহজ উপায় নেই ... এবং আমি এটি খুব হালকা চাই। সুতরাং আমি CSV পার্স এবং প্রতিবেদন করার জন্য একটি বেশ সহজ স্ক্রিপ্ট শুরু করেছি। আমি সিএসভি স্পেক পড়েছি এবং লক্ষ্য করেছি এটি আমার প্রত্যাশার চেয়ে আরও বিস্তৃত এবং ডাবল কোটে মোড়ানো মাল্টলাইন মানকে সমর্থন করে। আমি sedটোকেনাইজেশনের উপর নির্ভর করছিলাম তবে শীঘ্রই বুঝতে পারলাম যে sedকলটি মাল্টিলাইনগুলি দুটি লাইন পর্যন্ত রয়েছে। তাহলে আমার সিএসভি মানগুলির মধ্যে একটি যদি দুটির বেশি লাইনে ছড়িয়ে যায়?
সালাথিয়েল জেনেস

আপনার সমস্যাটিকে প্রশ্ন হিসাবে জিজ্ঞাসা করা ভাল।
অবিনাশ রাজ

8

sedহয় গুলি tream ইডি itor , যে আপনি ব্যবহার করতে পারেন |পাঠাতে (নল) মান স্ট্রিম মাধ্যমে (stdin এবং stdout- এ বিশেষভাবে) sedএবং তাদের ফ্লাইটে প্রোগ্রামেটিক্যালি পরিবর্তন, এটা ইউনিক্স দর্শন ঐতিহ্য একটি কুশলী হাতিয়ার তৈরির; তবে -iনীচে উল্লিখিত প্যারামিটারটি ব্যবহার করে সরাসরি ফাইলগুলি সম্পাদনা করতে পারে ।
নিম্নলিখিত বিবেচনা করুন :

sed -i -e 's/few/asd/g' hello.txt

s/এরfew সাথে প্রাপ্ত অভিব্যক্তিটি প্রতিস্থাপন করতে ব্যবহৃত হয় asd:

কয়েক, সাহসী।


আসাদ, সাহসী।

/g"গ্লোবাল" এর অর্থ দাঁড়ায়, পুরো লাইনের জন্য এটি করা। আপনি যদি /g( ছেড়ে দিয়ে থাকেন s/few/asd/তবে সর্বদা তিনটি স্ল্যাশ হওয়া দরকার না কেন) এবং fewএকই লাইনে দু'বার উপস্থিত হলে কেবল প্রথমটিতে fewপরিবর্তিত হবে asd:

কয়েক জন পুরুষ, কয়েকজন মহিলা, সাহসী।


আসাদ পুরুষ, কয়েকজন মহিলা, সাহসী।

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

নিম্নলিখিত দুটি বিকল্প (পতাকা) এক সাথে সংযুক্ত করা হয়েছে -ie:

-iবিকল্পটি ফাইলটিতে আই এন এডিট করতে ব্যবহৃত হয় hello.txt

-eএই ক্ষেত্রে ই- এক্সপ্রেশন / কমান্ডটি ইঙ্গিত করে s/

দ্রষ্টব্য: -i -eআপনি অনুসন্ধান / প্রতিস্থাপন করতে এটি ব্যবহার করা গুরুত্বপূর্ণ । যদি আপনি এটি করেন তবে আপনি -ie'ই' অক্ষর যুক্ত প্রতিটি ফাইলের একটি ব্যাকআপ তৈরি করবেন।


2

আপনি এটির মতো করতে পারেন:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 

উদাহরণস্বরূপ: সনাক্তকরণ কমান্ডের ফলে প্রাপ্ত সমস্ত ফাইলগুলিতে [লগডির ',' '] ([[]) ছাড়া [লগডির', os.getcwd ()] সহ সমস্ত উপস্থিতি প্রতিস্থাপন করুন:

ex1:

locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"

ex2:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

যেখানে [টেনসরবোর্ড / প্রোগ্রাম.পি] অনুসন্ধান করার জন্য ফাইল


ওহে. আপনার স্ট্রিংয়ের পছন্দ ( logdir', ''-> /logdir', os.getcwd()) এই উত্তরটিকে পার্স করা শক্ত করে তোলে। এছাড়াও, এটি উল্লেখ করা দরকার যে আপনার উত্তর প্রথমে সেড ব্যবহার করতে ফাইলগুলি সনাক্ত করে, কারণ এটি প্রশ্নের অংশ নয়।
mwfearnley

হাই, এই উত্তরটি উভয়ই অনুসন্ধান এবং ফাইলটিতে <পুরাতন পাঠ্য> পাওয়া গেলে সমস্ত প্রতিস্থাপন।
Nguyễn Tuấn আন

কেরাসে তারা টেনসরবোর্ড ব্যবহার করে এমন সকলের জন্য আমি এই উত্তরটি বেছে নিই, যারা কমান্ডটি পরিবর্তন করতে চান: টেনসরবোর্ড --logdir = '/ পাথ / টু / লগ / ফোল্ডার /' ব্যবহার করতে: লেন্স ফোল্ডারে থাকাকালীন শুধুমাত্র টেনসরবোর্ড। এটি খুব সুবিধাজনক
Nguyễn Tuấn Anh
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.