ব্যাশে কোনও চরিত্রের পরে আমি কীভাবে সমস্ত পাঠ সরিয়ে ফেলতে পারি?


147

আমি কীভাবে কোনও অক্ষরের পরে সমস্ত পাঠ মুছে ফেলতে পারি, এই ক্ষেত্রে কোলন (":"), বাশে? আমিও কোলন সরিয়ে ফেলতে পারি? কীভাবে করব তা আমার কোনও ধারণা নেই।

উত্তর:


134

একটি উদাহরণ দরকারী হতে পারে, কিন্তু আমি আপনাকে সঠিকভাবে বুঝতে পারলে, এটি কাজ করবে:

echo "Hello: world" | cut -f1 -d":"

এটি "হ্যালো: বিশ্ব" কে "হ্যালো" তে রূপান্তর করবে।


5
cutকাজ করে তবে আমি ডেনিসের উত্তর আরও ভাল এবং আরও নমনীয়। এটির মতো নতুন প্রক্রিয়াটি তৈরি হয়েছে কিনা তা কি কেউ জানেন cut?
জোবু 1324

3
বাশের অন্তর্নির্মিত প্যারামিটার সম্প্রসারণ বৈশিষ্ট্যগুলি ব্যবহার করে সাবস্কেলগুলি চলমান সরঞ্জামগুলি তৈরি করার চেয়ে ভাল ব্যবহার করা ভাল basenameএবং cutনীচে ডেনিসের উত্তর দেখুন
লুই ম্যাডডক্স

1
cutস্টাডিনের কাছ থেকে পড়তে পারে, তাই এটির জন্য বিশেষত যখন আপনার খুব দীর্ঘ স্ট্রিং থাকে যা কোনও ফাইলের বিষয়বস্তুর মতো প্রক্রিয়া করা প্রয়োজন।
সাহস

1
এবং এটি কীভাবে প্রয়োগ করা হবে hello: world। এটি অর্ধেক উত্তর।
কে - এসও-তে বিষক্রিয়া বাড়ছে।

এটি itution var /: / ''} এর মতো সাবস্ক্রিপশন সিনট্যাক্স ব্যবহার করেও করা যেতে পারে তবে কেবল ব্যাশে কাজ করে ..
মহেশ

264

বাশ (এবং ksh, zsh, ড্যাশ, ইত্যাদি) এ, আপনি প্যারামিটার সম্প্রসারণ ব্যবহার করতে পারেন %যা স্ট্রিংয়ের শেষ #থেকে অক্ষরগুলি সরিয়ে দেবে বা স্ট্রিংয়ের শুরু থেকে অক্ষরগুলি সরিয়ে ফেলবে। আপনি যদি এই অক্ষরগুলির মধ্যে একটিরও একটি ব্যবহার করেন তবে ক্ষুদ্রতম মিলে যাওয়া স্ট্রিংটি সরানো হবে। আপনি যদি চরিত্রটি দ্বিগুণ করেন তবে দীর্ঘতম সরিয়ে দেওয়া হবে।

$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow

6
এটি নেটিভ শেল স্ট্রিং ম্যানিপুলেশন, সুতরাং কোনও অতিরিক্ত প্রক্রিয়া তৈরি হবে না। রেফারেন্স বাশ প্যারামিটার সাবস্টিটিউশন , বাশ স্ট্রিং ম্যানিপুলেশন এবং আরও ভাল ব্যাশ স্ক্রিপ্টিং
ডডজি জাজাকুমা

@denniswilliamson কীভাবে আমি একটি নির্দিষ্ট স্ট্রিং মত পরে 2 অক্ষর মুছে ফেলা hello:worldহবে hello:woব্যবহার করে ${a%:*}?
3kstc

দুর্দান্ত উত্তর, অনেক অনেক ধন্যবাদ, তবে এটি "${a##*:}"কেবলমাত্র tomorrow=) পাওয়ার জন্য যুক্ত করে ভাল
লাগবে

1
@openCivilisation: আপনি সম্ভবত তারপর রেগুলার এক্সপ্রেশন ম্যাচিং ব্যবহার করতে হবে: a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ প্যাটার্ন]]; প্রতিধ্বনি "$ {BASH_REMATCH [1]}" `` কোলন থাকলেই তা মেলে। আপনি যদি এটি alচ্ছিক হতে চান তবে একটি আলাদা প্যাটার্ন ব্যবহার করতে হবে। বাশ রেজেক্সেসের একটি ব্যাখ্যা (এবং সাধারণভাবে regexes) এই মন্তব্যগুলির আওতার বাইরে। আপনি অন্যান্য প্রশ্নগুলি খুঁজে পেতে পারেন যা এটি আলোচনা করে বা আপনার নিজের পোস্ট করে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
@ কেপি 123: এটি আমার উত্তরের প্রথম উদাহরণ। দ্বিতীয়বার যখন আমি এটি দেখাব (যেখানে "আগামীকাল" অপসারণ করা হবে), আপনি প্রায় একই পরিস্থিতি সম্পর্কে জিজ্ঞাসা করছেন।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।


4
egrep -o '^[^:]*:'

আপনি কীভাবে এটি ব্যাখ্যা করতে পারেন, ধন্যবাদ।
rʒɑdʒɑ

1
egrepসঙ্গে গ্রেপ হয় -E। নিয়মিত থেকে এখানে কোনও পার্থক্য নেই grep-oগ্রেপকে নির্দেশের সাথে মেলে এমন লাইনের কেবলমাত্র অংশ মুদ্রণ করতে নির্দেশ দেয়। ^একটি লাইন শুরু ম্যাচ অ্যাঙ্কারস। [^:]*শূন্য বা আরও বেশি অক্ষরের সাথে মেলে যা :চরিত্র নয়। :চরিত্রের সাথে মেলে :
cdowie

ব্যাখ্যার জন্য আবার ধন্যবাদ
rdd

3

ধরা যাক এই ফর্ম্যাটটিতে আপনার ফাইল রয়েছে have

/dirA/dirB/dirC/filename.file

এখন আপনি কেবল সেই পথটি চান যাতে "/" চারটি অন্তর্ভুক্ত রয়েছে। আদর্শ

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"

এবং আপনার আউটপুট হবে

/dirA/dirB/dirC

কাটা ব্যবহারের সুবিধা হ'ল আপনি বড় ডিরেক্টরি পাশাপাশি ফাইলটিও কেটে ফেলতে পারেন (উদাহরণস্বরূপ), সুতরাং আপনি যদি টাইপ করেন

$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"

আপনার আউটপুট হবে

/dirA/dirB

যদিও আপনি স্ট্রিং এর অন্য দিক থেকে একই কাজ করতে পারেন তবে টাইপিংয়ের ক্ষেত্রে এটি এতটা বোঝায় না

$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"

ফলাফল স্বরূপ

dirA/dirB/dirC

কিছু অন্যান্য ক্ষেত্রে শেষ কেসটিও সহায়ক হতে পারে। মনে রাখবেন যে শেষ আউটপুটটির শুরুতে কোনও "/" নেই।


2
আপনার যদি "/res উত্স / পর্যালোচনা / অ্যাডমিন / ইউজার / রিলেশনশিপস / পেস্টস.ব্লেড.পিপি" ডিরেক্টরি থাকে এবং "/" -র সর্বশেষ উপস্থিতির পরে আপনি সমস্ত কিছু ছিন্ন করতে চান তবে আপনি কতজন জানেন না " "অক্ষরগুলি স্ট্রিংয়ে রয়েছে। সুতরাং এখানে আমি আউটপুটটি "/ রিসোর্স / ভিউ / অ্যাডমিন / ব্যবহারকারী / সম্পর্ক /" (অথবা এমনকি / সংস্থানগুলি / মতামত / অ্যাডমিন / ব্যবহারকারী / সম্পর্কের পিছনে স্ল্যাশ ছাড়াই) হতে চাই। আপনি এটা কিভাবে করবেন?
কেপি 123

-1

":" এর শেষ উদাহরণের পরে সবকিছু ছাঁটাই

cat fileListingPathsAndFiles.txt | grep -o '^.*:'

এবং আপনি যদি শেষটি ফেলে দিতে চান ":"

cat file.txt | grep -o '^.*:' | sed 's/:$//'

@ kp123: আপনি প্রতিস্থাপন করতে চান চাই :সঙ্গে /(যেখানে sed কোলন হওয়া উচিত \/)

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