কীভাবে কোনও ফাইল থেকে বিশদটি অনুলিপি করে নতুন ফাইলটিতে আটকানো যায়?


11

আমার কাছে আমার ব্যক্তিগত তথ্য (.txt) রয়েছে এমন একটি ফাইল রয়েছে। আমি কীভাবে টার্মিনালের মাধ্যমে ফাইল থেকে কয়েকটি বিশদ অনুলিপি করে এগুলি একটি নতুন .txtফাইলে রাখতে পারি?

উদাহরণস্বরূপ, যদি এটি ফাইলের বিষয়বস্তু হয়:

name : farah age : 23 phone number : 0123 education : degree

আমি কীভাবে কেবল বয়স এবং ফোন নম্বর অনুলিপি করতে পারি এবং সেগুলি একটি নতুন .txtফাইলে আউটপুট করতে পারি ?


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

উত্তর:


7

এই কাজ করার বিভিন্ন উপায় আছে। আপনার ফাইলটির কিছু পরিচিত কাঠামো থাকলে আপনি ব্যবহার করতে পারেন grepgrepকমান্ড অনুসন্ধান একটি নির্দিষ্ট ফ্রেজ এবং আয় লাইন যে যে ফ্রেজ ম্যাচের জন্য একটি ফাইল। সুতরাং যদি আপনার ফাইল মত দেখাচ্ছে

নাম: স্যালি

জন্ম তারিখ: 7.31.76

ঠিকানা: 1234 মেইন সেন্ট

এসএসএন: 123-45-6789

আপনি চালাতে পারেন grep Name info.txtএবং এটি ফিরে আসবে Name: Sally। তারপরে আপনি আউটপুটটিকে অন্য কোনও ফাইলে পুনর্নির্দেশ করতে পারেন । তাই কলিং

grep Name info.txt > info2.txt

নতুন ফাইল তথ্য 2.txt এ লাইন আউটপুট হবে। আপনি যদি নতুন লাইন যুক্ত করতে চান তবে আপনি এটি করতে পারেন

grep Address info.txt >> info2.txt

অন্যথায় ফাইলটি ওভাররাইট করা হবে।

আপনি ভিএম এর মতো একটি কমান্ড লাইন পাঠ্য সম্পাদক ব্যবহার করতেও শিখতে পারেন


2

আপনি ব্যবহার করতে পারেন , grep একটি জন্য অনুসন্ধান করতে রেগুলার এক্সপ্রেশন মধ্যে details.txt এবং নতুন ফাইলে ফলাফলের পুনর্নির্দেশ।

আপনি যে সমস্ত লাইন অনুলিপি করতে চান তাতে যদি অন্য কিছু লাইন থাকে তবে আপনি ব্যবহার করতে পারবেন না:

grep "string in common" details.txt > new.txt

যদি না হয় তবে আপনার কপি করতে চান এমন প্রতিটি লাইন অনুসন্ধান করতে হবে, তারপরেও গ্রেপ ব্যবহার করে >>এবং এটিকে স্থিরভাবে new.txt এ যুক্ত করতে হবে >


1

এখানে এমন সম্পাদকও রয়েছে যা টার্মিনালে কাজ করে, যেমন ন্যানো, ভিআই এবং ইমাকস।

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


1

ধরে নিচ্ছি ইনপুট ফাইলের details.txtমধ্যে রয়েছে:

name: farah
age: 23
phone number: 0123
education: degree

আপনি প্রসারিত গ্রেপ দ্বারা লাইন "নাম" এবং "ফোন" নির্বাচন করতে পারেন এবং আউটপুট new.txt এ পুনঃনির্দেশ করতে পারেন:

grep -E "age:|phone number:" details.txt > new.txt

এটি এর সাথে new.txt উত্পাদন করবে:

age: 23
phone number: 0123

কিভাবে এটা কাজ করে:

গ্রেপ প্রিন্টগুলি কেবল মিলিত রেখাগুলি। -Eঅপশন বর্ধিত regexp যা ব্যবহার আপনি সম্ভাবনা দেয় সক্রিয় |(বিকল্প)। পুরো প্যাটার্নটি উদ্ধৃত |করতে ভুলবেন না, তাই গ্রেপ দ্বারা ব্যাখ্যা করা হবে। অন্যথায় শেল ব্যাখ্যা করার চেষ্টা করবে। আপনি এটি এখানে চান না।


1

আপনি যে ফাইলটি দেখিয়েছেন তাতে একটি লাইনে সমস্ত বিবরণ রয়েছে:

name : farah age : 23 phone number : 0123 education : degree

আমি ধরে নিয়েছি যে আপনি age :কমান্ডের মধ্যে হার্ড-কোড ইত্যাদি করতে পারেন , তবে এটির পরে থাকা পাঠ্যটি ভিন্ন হবে এবং বিশদটি প্রদত্ত ক্রমে নাও বা সামঞ্জস্যপূর্ণ হতে পারে।

আপনি সঙ্গে সঙ্গতিপূর্ণ অংশগুলি নিষ্কাশন করতে পারেন grepএর -oপতাকা। এটি পুরো লাইনটির পরিবর্তে কেবল মিলে যাওয়া অংশটি মুদ্রণ করে।

আপনি যদি age :এবং phone number :অংশগুলি অন্তর্ভুক্ত করতে চান তবে আপনি -eএকাধিক ম্যাচ, বা বিকল্প পরিবর্তন করতে পতাকা ব্যবহার করতে পারেন ।

$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123

অভিব্যক্তিটির [^ ]*অর্থ এমন কোনও অক্ষর যা কোনও স্থান নয়, তাই এটি age :পরবর্তী স্থান পর্যন্ত অক্ষরের সাথে মেলে ।

fileআপনার বিশদ সম্বলিত ফাইলের নামটি প্রতিস্থাপন করুন। >অপারেটরের সাথে আউটপুটটিকে নতুন ফাইলে ডাইরেক্ট করে আপনি নতুন ফাইলটি লিখতে পারেন:

grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile

আপনি যখন এটি করেন, আপনি কোনও আউটপুট দেখতে পাবেন না। আপনার প্রথমে আউটপুটটি পরীক্ষা করা উচিত, তারপরে পুনঃনির্দেশ যুক্ত করুন।

এখানে বিকল্প সঙ্গে উদাহরণ। আমরা বর্ধিত রেগেক্স ব্যবহার করতে -Eপতাকাটি ব্যবহার করি grep। বাক্য গঠনটি হ'ল (pattern1|pattern2)- এটি মেলে pattern1এবং / অথবা pattern2। যদি উভয়কে পাওয়া যায় তবে এটি মুদ্রিত হবে (অন্যটি পাওয়া গেছে কিনা তা নির্বিশেষে)। আমি এখন +আগের বর্ণের কমপক্ষে একটি চরিত্রের অর্থ ব্যবহার করছি , এর পরিবর্তে *শূন্য বা পূর্বের বর্ণের আরও কিছু বোঝাতে চাইছি । এই প্রসঙ্গে, তারা উভয়ই সমানভাবে ভাল কাজ করে।

$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23 
phone number : 0123 

যদি আপনি age :এবং phone number:অংশগুলি বাদ দিতে চান তবে আপনি পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন ব্যবহার করতে -Pপতাকাটি ব্যবহার করতে পারেন grep। এটি বিকল্পটিকে সমর্থন করে এবং প্রদত্ত প্যাটার্নের পরেও পাঠ্য মেলার একটি উপায়কে সমর্থন করে:

$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123

আপনি যদি পাঠ্যটিকে অন্যভাবে ফর্ম্যাট করতে চান তবে আপনি ব্যবহার করতে পারেন sed, উদাহরণস্বরূপ:

$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123

এটি ageআগে আসার উপর নির্ভর করে phone number, সুতরাং যদি এটি না হয় তবে সেই অনুযায়ী সামঞ্জস্য করুন। আপনি যদি অর্ডারের উপর নির্ভর করতে না পারেন তবে আপনি এটি অত্যন্ত বিভ্রান্ত আদেশটি ব্যবহার করতে পারেন:

$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23

এটি লাইনটিকে পুনরায় সাজিয়েছে যাতে phone number :বিভাগটি প্রতিটি লাইনে প্রথমে আসে, তারপরে পছন্দসই বিশদটি নির্বাচন করতে দ্বিতীয় প্রতিস্থাপন করে। মুড়ু এই উত্তরটির জন্য এখানে ব্যবহৃত কৌশলটি আমার কাছে ণী

sedপূর্ববর্তী ব্যাখ্যা দ্বারা কমান্ডের নোটস অন্তর্ভুক্ত নয়

  • -rআরও পাঠযোগ্য কমান্ডের জন্য বর্ধিত রেজেক্স ব্যবহার করুন (জিএনইউ একই অর্থ sedবোঝে -E)
  • s/old/new/oldসঙ্গে প্রতিস্থাপনnew
  • (pattern)patternপরে \1বা অন্যান্য সহ রেফারেন্সে সংরক্ষণ করে \2(ক্যাপচার গ্রুপগুলি বাম-থেকে-ডান ক্রমের সাথে সম্পর্কিত - নোটটি sedকেবল এর মধ্যে 7 টি পর্যন্ত থাকবে!)।
  • .যে কোনও অক্ষর, সুতরাং .*যে কোনও অক্ষরের সংখ্যা উপস্থাপন করে।
  • ; শেল হিসাবে কমান্ড পৃথক।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.