আমি কীভাবে সেড ব্যবহার করে স্ট্রিং থেকে প্রথম এক্স অক্ষরগুলি কেটে ফেলব?


126

আমি একটি ছোট শিল্প বাক্সে এমবেডড লিনাক্সের জন্য শেল স্ক্রিপ্ট লিখছি। আমার কাছে টেক্সটযুক্ত একটি ভেরিয়েবল রয়েছে pid: 1234এবং আমি লাইনটি থেকে প্রথম এক্স অক্ষরগুলি ছাঁটাই করতে চাই, তাই কেবল 1234 থাকে। আমার আরও পরিবর্তনশীল রয়েছে যা আমাকে "পরিষ্কার" করা দরকার, তাই আমার এক্স এর প্রথম অক্ষরগুলি কেটে ফেলতে হবে এবং ${string:5}এটি আমার সিস্টেমে কোনও কারণে কাজ করে না।

বাক্সটি কেবল মনে হয় sed

আমি নিম্নলিখিতগুলি কাজ করার চেষ্টা করছি:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

কোন ধারনা?


10
যদি ${string:5}কাজ না করে তবে আপনি বাশ বা অন্য শেল ব্যবহার করছেন না যা সেই বাক্য গঠনটিকে সমর্থন করে। আপনি কোন শেল এবং সংস্করণ ব্যবহার করছেন? আপনার শেবাং দেখতে কেমন? আমার অনুমান যে আপনি ব্যবহার করছেন sh(যেমন dash) বা সম্ভবত zsh
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

উত্তর:


0

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

echo "$pid"|awk '{print $2}'

27
"স্ট্রিংতে প্রথম এন অক্ষরগুলি এড়িয়ে যান" এর জন্য এই প্রশ্নটি প্রথম হিট। আপনি প্রশ্নের উত্তর না।
jw

এটি কাজ করে বলে মনে হচ্ছে না, এবং যদি তা হয় তবে আপনি কীভাবে তা ব্যাখ্যা করতে পারেন
আলেকজান্ডার মিলস

এটি আমার সিস্টেমে কাজ করে। আপনার ক্ষেত্র বিভাজক নিয়ে কোনও সমস্যা হতে পারে, চেষ্টা করুন awk -F": " '{print $2}'। তবুও, আমার প্রিয় সমাধান নয়।
মজুথার

197

নিম্নলিখিত কাজ করা উচিত:

var="pid: 1234"
var=${var:5}

আপনি কি নিশ্চিত bashযে শেলটি আপনার স্ক্রিপ্টটি কার্যকর করছে?

এমনকি পসিক্স-সম্মতিযুক্ত

var=${var#?????}

একটি বাহ্যিক প্রক্রিয়া ব্যবহার করা পছন্দনীয় হবে, যদিও এটি আপনাকে একটি নির্দিষ্ট দৈর্ঘ্যের প্যাটার্ন আকারে 5-এর হার্ড-কোড করা প্রয়োজন।


1
আপনি দ্বিতীয় প্যারামিটার সহ দৈর্ঘ্যও নির্দিষ্ট করতে পারবেন: ${var:5:2}শুরু হবে 1এবং ফিরে আসবে 12
সর্বাধিক ক্যান্ডোসিয়া

107

এখানে প্রথম X অক্ষর ব্যবহার করে কাটা একটি সংক্ষিপ্ত পদ্ধতি cut(1)। এই উদাহরণটি 5 তম অক্ষর দিয়ে শুরু করে একটি স্ট্রিং কেটে প্রথম 4 টি অক্ষর সরিয়ে দেয়।

echo "$pid" | cut -c 5-

2
এটিই সহজ সমাধান!
ব্র্যান্ডন 1

2
প্রযুক্তিগতভাবে ওপি সেডের জন্য জিজ্ঞাসা করেছিল, তবে আমি মনে করি এটির জন্য সেরা সমাধান "স্ট্রিং থেকে আমি প্রথম এক্স অক্ষরগুলি কীভাবে টার্মিনাল / ব্যাশে] ফেলা যায়" যখন git log --pretty=oneline | cut -c 42- | head
গিটের

1
+1 সহজ এবং সহায়ক সমাধান .. যখন আমার কাছে http: // <উদাহরণ.com.com হিসাবে ইউআরএল ছিল এবং 'HTTP: //' প্রোটোকলটি কাটতে হয় আমাকে 7. এর পরিবর্তে ৮ টি চর হিসাবে বলতে হয় আমি জানি না তবে এটি আমার পক্ষে কাজ করে।
সন্তোষ কুমার অর্জুনান

1
সন্তোষ কুমার অর্জুনান: কারণ এটি "প্রতিধ্বনি" $ পিড "| কাট-সি 4-" উদাহরণটি প্রথম 4 টি অক্ষর কাটছে না তবে চতুর্থ চরিত্র থেকে শুরু করে সূত্রগুলি বের করে। সুতরাং এটি প্রথম 3 টি অক্ষর কেটে দেয়। সুতরাং, আপনি যদি first টি প্রথম অক্ষর কাটাতে চান তবে আপনি অষ্টম অক্ষর থেকে সমস্ত কিছু বের করতে চান এবং সত্যই "কাট-সি 8-" করতে পারেন
আল-আশ

1
@DeanHiller cut -c ${LEN}-। ভ্যারিয়েবলটি কী এবং কী নয় তা পার্থক্য করার জন্য কোঁকড়া ধনুর্বন্ধকগুলি বৈধ পরিবর্তনশীল অক্ষরের সাথে স্ট্রিং সংমিশ্রণ করতে ব্যবহৃত হয়। আপনি যদি এই বিষয়ে আরও তথ্য চান তবে এটি কেন / কীভাবে কাজ করে তার আরও সংস্থানগুলির জন্য "ব্যাশ ভেরিয়েবল স্ট্রিং কনকন্টেশন" সন্ধান করুন।
জাস্টকার্টি

46

সিনট্যাক্সটি ব্যবহার করতে -rবিকল্পটি ("স্ক্রিপ্টে বর্ধিত নিয়মিত অভিব্যক্তি ব্যবহার করুন") sedব্যবহার করুন {n}:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

1
কেসটি কেমন হবে, যদি আমি একটি স্ট্রিং থেকে শেষ এক্স অক্ষরগুলি ছাঁটাই করতে চাই?
কোকেশ

5
@ কোকেশ: আপনি sed -r 's/.{5}$//'পরিবর্তে শেষ 5 টি অক্ষর ফেলা করতে পারেন
মার্ক লংগায়ার

7
আপনি যদি ধনুর্বন্ধনী থেকে রক্ষা পান -r( -Eওএস এক্স, আইআইআরসি তে) ছাড়াই এটি করতে পারেন ( তবে এটি ওএস এক্সে কাজ করে কিনা তা জানেন না)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
@ ডেনিস: আমি সবেমাত্র পরীক্ষা করেছিলাম - ওএস এক্স-r-E
গর্ডন ডেভিসন

15

স্ট্রিং থেকে প্রথম দুটি অক্ষর কাটা:

$ string="1234567890"; echo "${string:2}"
34567890

@ dtp70 একটি জেনেরিক উত্তর অনেক ধন্যবাদ, এটি দুর্দান্ত কাজ করেছে!
wolfram77

10

এটিকে পাইপ করুন awk '{print substr($0,42)}'যেখানে নামার অক্ষরের সংখ্যার চেয়ে 42 বেশি। উদাহরণ স্বরূপ:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

8

সম্ভাবনা আছে, আপনারও আছে cut। যদি তাই:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

1
সমস্যাটি cutহ'ল এটি হোয়াইটস্পেসের ক্রমগুলি সংবেদনশীলভাবে পরিচালনা করে না, tr -s ' '"স্পেস" স্পেস ব্যবহার করে এটি আরও ভাল আচরণ করে।
থোর

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

5

ঠিক আছে sed, সিনট্যাক্স সহ awk, cutএবং ব্যবহারের সাথে এখানে সমাধান রয়েছে bash। আমি কেবল অন্য একটি পসিক্স কনফর্ম রূপটি নিক্ষেপ করতে চাই:

$ echo "pid: 1234" | tail -c +6
1234

-cইনপুট ডেটার শেষে থেকে গণনা করে কোন বাইটটি অফসেটটি শুরু করতে বলা হয়, তবুও যদি সংখ্যাটি কোনও +চিহ্ন দিয়ে শুরু হয় তবে এটি ইনপুট ডেটার শুরু থেকে শেষ পর্যন্ত হয়।


4

অন্য উপায়, cutপরিবর্তে ব্যবহার sed

result=`echo $pid | cut -c 5-`

তিনি প্রথম 4 টি অক্ষর মুছে ফেলতে চান। এটি প্রথম 4 টি অক্ষর পায়।
এমএম

2

আমি এই প্রশ্নের দ্বারা সরবরাহিত খাঁটি সেডের উত্তর পেয়েছি (স্বীকারোক্তিযুক্ত, এই প্রশ্ন পোস্ট হওয়ার পরে পোস্ট করা হয়েছে)। এটি সম্পূর্ণরূপে সম্পূর্ণরূপে আপনি যা চেয়েছিলেন ঠিক তা করে:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

ডট ইন sed '/./) যা কিছু আপনি মেলাতে চান is আপনার প্রশ্নটি হুবহু আমি যা চেষ্টা করে যাচ্ছিলাম তা ছাড়া আমার ক্ষেত্রে আমি কোনও ফাইলের একটি নির্দিষ্ট রেখার সাথে মেলে এবং তারপরে এটি uncomment করতে চেয়েছিলাম। আমার ক্ষেত্রে এটি ছিল:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

এর -iপরে sedফাইলটি জায়গায় জায়গায় সম্পাদনা করা হয় (আপনি যদি ফাইলটি সম্পাদনা করার আগে আপনার মিলের অভিব্যক্তিটি পরীক্ষা করতে চান তবে এই স্যুইচটি সরিয়ে ফেলুন)।

(আমি এটি পোস্ট করেছি কারণ এই প্রশ্নটি জিজ্ঞাসা করার সাথে সাথে আমি সম্পূর্ণভাবে এই কাজটি করতে চেয়েছিলাম এবং পূর্ববর্তী উত্তরের কেউই এই সমস্যার সমাধান করেনি))


1

শুরু থেকে এন অক্ষর মুছে ফেলার পরিবর্তে, সম্ভবত আপনি সরাসরি অঙ্কগুলি বের করতে পারেন। তাই ভালো...

$ echo "pid: 1234" | grep -Po "\d+"

এটি আরও দৃ solution় সমাধান হতে পারে এবং আরও স্বজ্ঞাত বলে মনে হচ্ছে।

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