বাশে স্ট্রিং পার্থক্য


110

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

আমি দেখতে পাচ্ছি যে কম, ডিফ, সিএমপি সবই দুটি ফাইল বা একটি ফাইল এবং স্ট্যান্ডার্ড ইনপুট পাস করতে দেয় - আমার ধারণা আমি যদি দুটি ফাইল আউটপুট না দিতে চাই তবে এটি বেশ ভাল ... তবে এটি এখনও কিন্ডা চুষছে।

আমি গ্রেপ বা নিয়মিত ভাব প্রকাশ করতে পারি এই ভেবে খনন করা হয়েছে - তবে আমি অনুমান করি না।


1
এটা আসলে আপনি কি করতে চান?

আপনি তুলনার জন্য আইএফএস পরিবর্তনগুলির সাথে সাবস্ট্রিং ম্যানিপুলেশনস এবং বিল্টিন টেস্ট ক্রিয়াকলাপগুলি ব্যবহার করতে পারেন তবে আপনি যদি জানতে চান যে আপনি চরিত্রের সাথে অক্ষর, শব্দ থেকে শব্দ, লাইন দ্বারা
প্রবাহিত

উত্তর:


198

ব্যবহার diffবা comবা যদি আপনি চান যাই হোক না কেন:

diff  <(echo "$string1" ) <(echo "$string2")

গ্রেগের বাশ FAQ: প্রক্রিয়া সাবস্টিটিউশন

বা একটি নামক পাইপ দিয়ে

mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p

গ্রেগের বাশ FAQ: নামযুক্ত পাইপগুলির সাথে কাজ করা ipes

নামী পাইপ ফিফো নামেও পরিচিত।

-তার নিজের উপর স্ট্যান্ডার্ড ইনপুট জন্য।

<<< এটি একটি "এখানে স্ট্রিং"।

&মত ;তবে পটভূমিতে রাখে


5
সঠিক উত্তরের জন্য +1। চিহ্নগুলির দুর্দান্ত ব্যাখ্যার জন্য +1। অতিরিক্ত হিসাবে, গ্রেগের বাশ এফএকিউতে স্থানান্তরিত হয়েছে: mywiki.wooledge.org উপরের পৃষ্ঠাগুলির লিঙ্কগুলি এখন mywiki.wooledge.org/ প্রসেসসস্টিটিউশন এবং মাইউইকি.উইলজিইউআর.ইউ
বশএফএকিউ/

ধন্যবাদ! এবং এছাড়াও, এটি গতিশীল ফাইল বর্ণনাকারী দেখায়FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
কুমারী শক্তি

আমি দুটি শামস তুলনা করার জন্য এটি খুঁজছিলাম। এটি করার জন্য আরও মার্জিত উপায় আছে কিনা তা নিশ্চিত নয়, তবে এটি কার্যকর হয়।
ফুমা

Work স্ট্রিং 1 এবং $ স্ট্রিং 2-তে একাধিক লাইন থাকলে এবং যুক্ত বা বিয়োগকৃত লাইনগুলি পৃথক করে যদি এটি কাজ করে বলে মনে হয়। স্ট্রিংটি যদি একটি একক লাইন এবং রেখা হয় এবং দুটি স্ট্রিংয়ের মধ্যে কিছু পার্থক্য থাকে তবে?
alpha_989

@ alpha_989, এখানে আপনার উত্তর: $ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.") \n 1c1 \n < Here are the letters in String One. \n --- \n > Here are the characters in String Two. \nপাইপটি ব্যবহারের অনুরূপ, এটি কোনও প্রক্রিয়া নম্বর না দেখিয়ে পরবর্তীটির 1c1পরে শুরু হয় $এবং আপনি <kbd> <kbd> প্রবেশ না করা অবধি অপেক্ষা করেন (অথবা আপনি অন্যান্য আদেশগুলি করতে পারেন ...)
bবলldave025

19

আমাকে এই প্রশ্নটির কথা মনে করিয়ে দেয়: আপনি কীভাবে বাশের দুটি পাইপলাইন আলাদা করতে পারেন?

আপনি যদি বাশ সেশনে থাকেন তবে আপনি এটি করতে পারেন:

diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)

সঙ্গে <ব্যাশ দ্বারা পরিচালিত - - যাতে তারা তৈরি করেছেন এবং স্বয়ংক্রিয়ভাবে ধ্বংস অস্থায়ী ফাইল অসদৃশ হয় বেনামী নামে পাইপ তৈরি করা।

সুতরাং আপনি যদি আদেশের (গ্রেপ, অ্যাজক, সেড, ...) অংশ হিসাবে আপনার দুটি পৃথক স্ট্রিং পৃথক করে পরিচালনা করেন তবে আপনি করতে পারেন - উদাহরণস্বরূপ - এর মতো কিছু:

diff < grep string1 myFile < grep string2 myFile

(যদি আপনি মনে করেন যে আপনার ফাইল লাইনের মতো string1=very_complicated_valueএবং এ string2=another_long_and_complicated_value': আপনার ফাইলের অভ্যন্তরীণ ফর্ম্যাটটি না জেনে আমি একটি সুনির্দিষ্ট আদেশ দিতে পারি না)


13

আমি cmpবাশের বিকল্প প্রতিস্থাপন বৈশিষ্ট্যটিকে পছন্দ করি এবং প্রক্রিয়া করি :

$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
  2 142 b    161 q
  5 141 a    145 e

2 পজিশনে বলছি, আব প্রথমটির জন্য ঘটে তবে দ্বিতীয়টির জন্য aq হয়। 5 পজিশনে, আরেকটি পার্থক্য ঘটছে। কেবল সেই স্ট্রিংগুলিকে ভেরিয়েবল দ্বারা প্রতিস্থাপন করুন এবং আপনি সম্পন্ন করেছেন।


স্ট্রিংগুলি একই দৈর্ঘ্যের হয় যখন এটি কাজ করে!
strpeter

11

বলুন আপনার কাছে তিনটি স্ট্রিং রয়েছে

a="this is a line"
b="this is"
c="a line"

ক থেকে উপসর্গ খ অপসারণ করতে

echo ${a#"$b"}  # a line

ক থেকে প্রত্যয় সি অপসারণ করতে

echo ${a%"$c"}  # this is

2
আমার ধারণা এটি করা বাশ উপায়। এটা সুন্দরভাবে কাজ করেছে। যদিও সিনট্যাক্সটি বুঝতে কিছুটা শক্ত।
মিকেল রুস

@ মিকায়েলরোস সম্মত হয়েছে পড়তে সহজ (যাইহোক আমার জন্য) সেড ব্যবহার করা হবে: echo "$a" | sed "s!^$b!!g" (ভেরিয়েবলগুলি যদি পাথের সাথে সম্পর্কিত হয় তবে আমি স্ট্যান্ডার্ড সেড বিভাজককে / এর জন্য সরিয়ে দিয়েছি Also এছাড়াও, আপনি প্রতিধ্বনির পরিবর্তে এখানে একটি স্ট্রিং ব্যবহার করতে পারেন sed ... <<< $a:)
ACK_stoverflow

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