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


কিভাবে কমান্ড লাইন ব্যবহার করে একটি টেক্সট ফাইলে নির্দিষ্ট শব্দগুলি খুঁজতে এবং প্রতিস্থাপন করতে পারি?


437
2018-01-07 04:10


উত্স


আপনার আগ্রহের মে github.com/lucio-martinez/rch :-) - Lucio


উত্তর:


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

ব্যাখ্যা:

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

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


728
2018-01-07 04:23



@ এমসি এক্সচেঞ্জ যদি এটি বিশেষভাবে হয় / আপনি যে অক্ষরটিকে মিলতে চান তার জন্য আপনি কেবল বিভাজক হিসাবে অন্য কোন চরিত্র ব্যবহার করতে পারেন (উদাঃ। 's_old/text_new/text_g')। অন্যথায়, আপনি একটি স্থাপন করতে পারেন \  এর আগে কোন $ * . [ \ ^ আক্ষরিক চরিত্র পেতে। - cscarney
@ ব্রায়ানজেড যতক্ষণ পর্যন্ত ফাইল সিস্টেমটি উদ্বিগ্ন হয় sed এর আউটপুট একই নামের সাথে একটি নতুন ফাইল। এটা এক সাধারণত বাগ না যে বাগ রিপোর্ট - cscarney
তুমি চাইতে পারো s/\boriginal\b/new/g পরিবর্তে s/original/new/g (\b একটি শব্দ সীমানা এ ম্যাচ) শুধুমাত্র পুরো শব্দ প্রতিস্থাপন। - Chris Martin
ওএসএক্স কমান্ড sed -i '.bak' 's/original/new/g' file.txt একটি শূন্য দৈর্ঘ্য এক্সটেনশন সঙ্গে চালানো যেতে পারে sed -i '' 's/original/new/g' file.txt, কোন ব্যাকআপ উৎপন্ন করবে যা। - Kirk
MacOS ব্যবহারকারীদের -i এর জন্য একটি পরামিতি হিসাবে -i পরে '' '' যোগ করতে হবে ed.gs/2016/01/26/os-x-sed-invalid-command-code যাতে ফাইল overwritten হবে। - geoyws


এই কাজ করার বিভিন্ন উপায় আছে। এক ব্যবহার করা হয় sed এবং Regex। 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

26
2018-01-07 04:26



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


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

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

  2. s বিকল্প

  3. g প্রতিটি লাইন সব ঘটনা প্রতিস্থাপন করুন

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


15
2018-04-16 18:36





Awk এর gsub কমান্ডের মাধ্যমে,

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

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

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

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

14
2017-07-02 12:59



আমি MacOS টার্মিনালে এটি ব্যবহার করেছি এবং এটি কিছুই করেনি ... - Jim


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

এই উত্তর আমি সহজ ব্যবহার করছি 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

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 

AWK যুক্তি হিসাবে একটি ইনপুট ফাইল নিতে পারে, তাই একই জিনিস করে input.txt , সহজ হবে:

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

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

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

SED

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

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

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

পার্ল

পার্ল আরেকটি সরঞ্জাম যা প্রায়ই টেক্সট প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়, তবে এটি একটি সাধারণ উদ্দেশ্য ভাষা, এবং এটি নেটওয়ার্কিং, সিস্টেম প্রশাসনের, ডেস্কটপ অ্যাপ্লিকেশানগুলিতে এবং অন্যান্য অনেক স্থানে ব্যবহৃত হয়। এটি C, sed, awk এবং অন্যান্যদের মতো অন্যান্য ভাষাগুলির অনেকগুলি ধারণা / বৈশিষ্ট্যগুলি ধার করেছে। সহজ প্রতিস্থাপন তাই করা যাবে:

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

যেমন সিডি, পার্ল এছাড়াও -আই পতাকা আছে।

পাইথন

এই ভাষা খুব বহুমুখী এবং বিভিন্ন অ্যাপ্লিকেশন ব্যবহার করা হয়। এটা স্ট্রিং সঙ্গে কাজ করার জন্য অনেক ফাংশন আছে, যা মধ্যে 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 কমান্ড লাইন যুক্তি হিসাবে।

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


12
2018-02-03 07:49





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

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

s/ ব্যবহার করা হয় গুলিপাওয়া অভিব্যক্তি ubstitute few সঙ্গে asd:

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


আড, সাহসী।

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

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


আসস পুরুষ, কয়েক নারী, সাহসী।

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

নিম্নলিখিত দুটি বিকল্প (পতাকা) এক মধ্যে মিলিত হয়, -ie:

-i বিকল্প সম্পাদনা করতে ব্যবহার করা হয় আমিফাইল উপর n স্থান hello.txt

-e বিকল্প নির্দেশ করে এক্সপ্রেসন / কমান্ড চালানোর জন্য, এই ক্ষেত্রে s/

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


6
2017-11-23 09:00





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

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

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

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

যেখানে [tensorboard / program.py] অনুসন্ধান করার জন্য ফাইল


0
2017-07-24 02:13



হাই। স্ট্রিং আপনার পছন্দ (logdir', '' -> /logdir', os.getcwd()) পার্স এই কঠিন উত্তর তোলে। এছাড়াও, আপনার উত্তরটি প্রথমে সিডি ব্যবহার করার জন্য ফাইলগুলিকে সনাক্ত করে এমনটি উল্লেখ করার যোগ্য, কারণ এটি প্রশ্নের অংশ নয়। - mwfearnley
হাই, এই উত্তরটি অনুসন্ধানে এবং প্রতিস্থাপিত হলে ফাইলটিতে <পুরানো পাঠ> পাওয়া যায়। - Nguyễn Tuấn Anh
আমি এই উত্তরটি কেয়ারগুলিতে ট্যাঙ্কারবোর্ড ব্যবহার করার জন্য পছন্দ করি, যারা এই কমান্ডটি পরিবর্তন করতে চান: tensorboard --logdir = '/ path / to / log / folder /' ব্যবহার করতে: শুধুমাত্র লগ-ফোল্ডারে থাকাকালীন tensorboard। এটা খুব সুবিধাজনক - Nguyễn Tuấn Anh