শেল স্ক্রিপ্টে স্ট্রিং ম্যানিপুলেশন ব্যবহার করে একটি স্ট্রিংয়ের শেষ অক্ষর মুছুন


187

আমি একটি স্ট্রিংয়ের শেষ চরিত্রটি মুছতে চাই, আমি এই ছোট স্ক্রিপ্টটি চেষ্টা করেছি:

#! /bin/sh 

t="lkj"
t=${t:-2}
echo $t

তবে এটি "এলকেজে" মুদ্রণ করে, আমি কী ভুল করছি?

উত্তর:


115

পসিক্স শেলের মধ্যে সিনট্যাক্সের ${t:-2}অর্থ অন্যরকম কিছু হয় - এটি সেট এবং অ শূন্য tথাকলে মানটির মধ্যে প্রসারিত হয় tএবং অন্যথায় মানটিতে 2। প্যারামিটার সম্প্রসারণ দ্বারা একটি অক্ষর ছাঁটাতে, আপনি সম্ভবত চান সিনট্যাক্সটি${t%?}

মনে রাখবেন যে, মধ্যে ksh93, bashবা zsh, ${t:(-2)}বা ${t: -2}(স্থান মনে রাখবেন) হয় একটি সাবস্ট্রিং সম্প্রসারণ যেমন আইনি কিন্তু সম্ভবত না কি আপনি চান, যেহেতু তারা সাবস্ট্রিং শেষ থেকে একটি অবস্থান থেকে শুরু 2 অক্ষর (আসতে অর্থাত সরিয়ে ফেলা হবে প্রথম অক্ষর iএর স্ট্রিং ijk)।

আরও তথ্যের জন্য বাশ রেফারেন্স ম্যানুয়ালটির শেল প্যারামিটার সম্প্রসারণ বিভাগটি দেখুন:


4
'%' এর পিছনে যাদু কী তা বোঝানোর জন্য আপনি যত্ন নিতে পারেন? ?
আফ্রাইস

8
@ আফ্রাইস ${parameter%word}সংক্ষিপ্ত প্রত্যয় প্যাটার্ন মেলানো সরিয়ে দেয়wordman bash
স্ট্যান্ড্রাইভার

3
এটি বাশ 4.1.2 এর জন্য ভাল কাজ করে: সেন্টোস / আরএইচএল 6.x এর সাথে আটকে থাকা লোকদের জন্য
জোয়ে টি

185

সঙ্গে bash4.2 এবং উপরোক্ত, আপনি করতে পারেন:

${var::-1}

উদাহরণ:

$ a=123
$ echo "${a::-1}"
12

লক্ষ্য করুন যে পুরানোদের জন্য bash(উদাহরণস্বরূপ, bash 3.2.5ওএস এক্সে) আপনার কোলনের মধ্যে এবং পরে ফাঁকা জায়গা ছেড়ে দেওয়া উচিত:

${var: : -1}

13
এটি bash4..২-আলফা এবং এর উপরের সংস্করণে কাজ করে, আমার যে সংস্করণটিতে অ্যাক্সেস রয়েছে তা খুব খারাপ। : - /
hjk

2
@ আইমাজিজ: বাশ চেঞ্জলগ থেকে, নেতিবাচক দৈর্ঘ্যটি ${var:offset:lenght}কেবলমাত্র যুক্ত করা হয়েছিল bash 4.2। হতে পারে ওএসএক্স এর জন্য নিজস্ব প্যাচ যুক্ত করে bash
cuonglm

1
@cuonglm কোনটিই কাজ করে না: /
iamaiz

1
ম্যাকের কাজ করে না।
shinzou

1
ম্যাকস্টাররা, রাশিয়ার জবাবটি নীচে দেখুন
P i

67

nলাইন থেকে শেষ অক্ষরগুলি অপসারণের জন্য যা sedOR ব্যবহার করে না awk:

> echo lkj | rev | cut -c (n+1)- | rev

সুতরাং উদাহরণস্বরূপ আপনি এটি one characterব্যবহার করে শেষ চরিত্রটি মুছতে পারেন :

> echo lkj | rev | cut -c 2- | rev

> lk

revম্যানপেজ থেকে :

বর্ণনা
রেভ ইউটিলিটি প্রতিটি লাইনের অক্ষরের ক্রমকে বিপরীত করে নির্দিষ্ট ফাইলগুলিকে স্ট্যান্ডার্ড আউটপুটে অনুলিপি করে। যদি কোনও ফাইল নির্দিষ্ট করা না হয় তবে স্ট্যান্ডার্ড ইনপুটটি পড়া হয়।

হালনাগাদ:

আপনি যদি স্ট্রিংয়ের দৈর্ঘ্য জানেন না, তবে চেষ্টা করুন:

$ x="lkj"
$ echo "${x%?}"
lk

61

সেড ব্যবহার করা যতটা দ্রুত হওয়া উচিত

sed 's/.$//'

আপনার একক প্রতিধ্বনি তখন echo ljk | sed 's/.$//'
এটি ব্যবহার করে, 1-লাইনের স্ট্রিংটি যে কোনও আকারের হতে পারে।


10
নোট করুন যে সাধারণ ক্ষেত্রে এটি স্ট্রিংয়ের শেষ অক্ষরটি মুছে দেয় না , তবে স্ট্রিংয়ের প্রতিটি লাইনের শেষ অক্ষর ।
স্টাফেন চেজেলাস

44

শেলের উপর নির্ভর করে কয়েকটি বিকল্প:

  • POSIX: t=${t%?}
  • বোর্ন: t=`expr " $t" : ' \(.*\).'`
  • zsh / যশ: t=${t[1,-2]}
  • ব্যাশ / zsh: t=${t:0:-1}
  • ksh93 / ব্যাশ / zsh / mksh: t=${t:0:${#t}-1}
  • ksh93 / ব্যাশ / zsh / mksh: t=${t/%?}
  • ksh93: t=${t/~(E).$/}
  • স্প্যানিশ ভাষায়: @ {t=$1} ~~ $t *?

মনে রাখবেন যে সকলের শেষ চরিত্রটি ছাঁটাই করার কথা থাকলেও আপনি দেখতে পাবেন যে কিছু বাস্তবায়ন (যারা মাল্টি-বাইট অক্ষরকে সমর্থন করে না) তার পরিবর্তে শেষ বাইটটি স্ট্রিপ করে (সুতরাং সম্ভবত শেষ চরিত্রটি যদি এটি মাল্টি-বাইট হয়ে থাকে তবে দুর্নীতিগ্রস্থ হবে )।

exprবৈকল্পিক অনুমান $tএকাধিক newline অক্ষর শেষ হয় না। যদি ফলে স্ট্রিং হচ্ছে শেষ পর্যন্ত এটি একটি নন-জিরো প্রস্থান অবস্থা ফিরে আসবে 0(অথবা 000বা এমনকি -0কিছু বাস্তবায়নের সহ)। স্ট্রিংয়ে অবৈধ অক্ষর থাকলে এটি অপ্রত্যাশিত ফলাফলও দিতে পারে।


সুন্দর এবং পুঙ্খানুপুঙ্খ! তবে ... আমি ধরে নিলাম she সমস্ত শেলই পসিক্সকে সমর্থন করে, সুতরাং প্রত্যেককে কেবল সেইটিকে সবচেয়ে বহনযোগ্য হিসাবে ব্যবহার করা উচিত। ক্ষুদ্রতম চরিত্রের গণনাও!
রাশ

@ রাশ, t=${t%?}বোর্ন নয় তবে আপনি আজকাল বোর্ন শেল পেরিয়ে আসবেন না। ${t%?}যদিও অন্য সবগুলিতে কাজ করে।
স্টাফেন চেজেলাস

কোনও ফিশ শেলের বিকল্প দেওয়া হয়নি! সম্ভবত আজকাল ksh93 এর চেয়ে বেশি জনপ্রিয় ...
rien333

@ rien333। আমি ইন্টারফেসটি কিছুটা স্থিতিশীল হওয়ার জন্য অপেক্ষা করতাম। fishকাজ চলছে। ২.৩.০ যা বিল্টিনটি চালু করেছিল stringতা প্রশ্নোত্তরের সময়ে প্রকাশিত হয়নি not আমি যে সংস্করণটি এটি পরীক্ষা করছি তাতে আপনার প্রয়োজন string replace -r '(?s).\z' '' -- $t(এবং আমি আশা করতাম যে তারা এটি পরিবর্তন করতে চান, তাদের পিসিআরইতে যে পতাকাগুলি প্রেরণ করা হয়েছে সেগুলি পরিবর্তন করা উচিত) বা আরও সংশ্লেষিত হয়েছে। এটি নিউলাইন চরিত্রগুলির সাথেও খারাপভাবে আচরণ করে এবং আমি জানি তারাও এটি পরিবর্তন করার পরিকল্পনা করছে're
স্টাফেন চেজেলাস

পসিক্স উত্তরের জন্য উত্সাহিত। বাশ ৩.২.৫ 1 (১)
অবিন্দ্র গলচরণ

26

সর্বাধিক বহনযোগ্য এবং সংক্ষিপ্ততম উত্তরটি প্রায় অবশ্যই:

${t%?}

এটি বাশ, শ, ছাই, ড্যাশ, ব্যস্তবক্স / অ্যাশ, জেডএস, কেএসএ ইত্যাদিতে কাজ করে

এটি পুরানো-স্কুল শেল প্যারামিটার সম্প্রসারণ ব্যবহার করে কাজ করে। বিশেষত, গ্লোব প্যাটার্নের সাথে মেলে এমন %পরামিতিগুলির সবচেয়ে ছোট ম্যাচিং প্রত্যয়টি মুছে ফেলার জন্য নির্দিষ্ট করে (যেমন: কোনও অক্ষর)।t?

একটি (অনেক) আরও বিশদ বিবরণ এবং আরও পটভূমির জন্য এখানে "ক্ষুদ্রতম প্রত্যয় প্যাটার্ন সরান" দেখুন । man bash"প্যারামিটার সম্প্রসারণ" এর অধীনে আপনার শেলের জন্য দস্তাবেজগুলি (যেমন :) দেখুন।


পার্শ্ব নোট হিসাবে, আপনি যদি পরিবর্তে প্রথম অক্ষরটি সরিয়ে ফেলতে চান তবে আপনি ব্যবহার করবেন ${t#?}, যেহেতু #পিছনের (প্রত্যয়) পরিবর্তে স্ট্রিংয়ের (উপসর্গ) সামনের দিক থেকে ম্যাচগুলি।

এছাড়াও লক্ষণীয় যে উভয় %এবং #আছে %%এবং ##সংস্করণ, যা সংক্ষিপ্তের পরিবর্তে প্রদত্ত প্যাটার্নটির দীর্ঘতম সংস্করণের সাথে মেলে । উভয় ${t%%?}এবং ${t##?}এই ক্ষেত্রে তাদের একক অপারেটর হিসাবে একই কাজ করবে, যদিও (সুতরাং অকেজো অতিরিক্ত অক্ষর যুক্ত করবেন না)। এর কারণ প্রদত্ত ?প্যাটার্নটি কেবল একটি একটি চরিত্রের সাথে মেলে। *কিছু অ-ওয়াইল্ডকার্ডের সাথে মিশ্রিত করুন এবং জিনিসগুলি আরও %%এবং আরও আকর্ষণীয় হয়ে ওঠে ##

প্যারামিটারের বিস্তৃতি বোঝা, বা কমপক্ষে তাদের অস্তিত্ব সম্পর্কে জেনে রাখা এবং সেগুলি কীভাবে সন্ধান করা যায় তা জেনে রাখা, অনেক স্বাদের শেল স্ক্রিপ্টগুলি লেখার এবং ডিক্রিফারিংয়ের জন্য অবিশ্বাস্যভাবে কার্যকর। প্যারামিটার প্রসারণও প্রায়ই অনেক মানুষের কাছে রহস্যময় শেল জাদু মত চেহারা কারণ ... ভাল ... তারা হয় রহস্যময় শেল জাদু (যদিও চমত্কার তথ্যসমৃদ্ধ যদি আপনি "প্যারামিটার সম্প্রসারণ" জন্য সন্ধান জানি)। আপনি শেল আটকে গেলে অবশ্যই ডিভাইস বেল্টে থাকা ভাল।


সংক্ষিপ্ত এবং মিষ্টি, এবং ম্যাকওএস এবং লিনাক্স উভয় ক্ষেত্রেই কাজ করে!
dbernard

18
t=lkj
echo ${t:0:${#t}-1}

আপনি 0 থেকে স্ট্রিংয়ের দৈর্ঘ্য -1 এ একটি স্ট্রিং পাবেন। তবে খেয়াল করুন যে এই বিয়োগটি বাশ নির্দিষ্ট, এবং অন্যান্য শেলগুলিতে কাজ করবে না।

উদাহরণস্বরূপ, dashএমনকি পার্স করতে সক্ষম হয় না

echo ${t:0:$(expr ${#t} - 1)}

উদাহরণস্বরূপ, উবুন্টুতে, /bin/shহয়dash


15

আপনি headসর্বশেষ অক্ষর ব্যতীত সমস্ত মুদ্রণ করতেও ব্যবহার করতে পারেন ।

$ s='i am a string'
$ news=$(echo -n $s | head -c -1)
$ echo $news
i am a strin

তবে দুর্ভাগ্যক্রমে কয়েকটি সংস্করণ headনেতৃস্থানীয় -বিকল্পটি অন্তর্ভুক্ত করে না । এটি headওএস এক্সের ক্ষেত্রে আসে for


5

নিয়মিত এক্সপ্রেশন ব্যবহার করে এটি করা যথেষ্ট সহজ:

n=2
echo "lkj" | sed "s/\(.*\).\{$n\}/\1/"

5

কিছু পরিমার্জন। একাধিক অক্ষর অপসারণ করতে, আপনি একাধিক প্রশ্ন চিহ্ন যুক্ত করতে পারেন। উদাহরণস্বরূপ, চলক থেকে শেষ দুটি অক্ষর অপসারণ করতে:, $SRC_IP_MSGআপনি ব্যবহার করতে পারেন:

SRC_IP_MSG=${SRC_IP_MSG%??}

4

খাঁটি বাশের কিছু সম্ভাব্য ব্যবহারগুলি সম্পূর্ণ করার জন্য:

#!/bin/bash

# Testing substring removal
STR="Exemple string with trailing whitespace "
echo "'$STR'"
echo "Removed trailing whitespace: '${STR:0:${#STR}-1}'"
echo "Removed trailing whitespace: '${STR/%\ /}'"

প্রথম বাক্য গঠনটি একটি স্ট্রিং থেকে একটি স্ট্রিং নেয়, বাক্য বাক্যটি দ্বিতীয়টির জন্য চিহ্নটি লক্ষ্য করুন , যার অর্থ 'রেখার শেষ থেকে' এবং বাক্য গঠনটি হ'ল
${STRING:OFFSET:LENGTH}
%
${STRING/PATTERN/SUBSTITUTION}

এবং এখানে উল্লিখিত দুটি সংক্ষিপ্ত রূপ রয়েছে

echo "Removed trailing whitespace: '${STR::-1}'"
echo "Removed trailing whitespace: '${STR%\ }'"

এখানে আবার %চিহ্নটি লক্ষ্য করুন, যার অর্থ 'মুছে ফেলুন (যেটি প্রতিস্থাপন করুন') সাথে সংক্ষিপ্ততম ম্যাচিং প্যাটার্ন (এখানে প্যারামিটারের শেষে থেকে ' পালানো স্থান দ্বারা উপস্থাপিত ' represented ' - এখানে নামকরণ করা হয়েছে এসটিআর


1

যেমন আমরা পিএইচপি ব্যবহার করতে পারি কমান্ড লাইনে, বা শেল স্ক্রিপ্টগুলিতে। এটি কখনও কখনও সার্জিকাল পার্সিংয়ের জন্য কার্যকর।

php -r "echo substr('Hello', 0, -1);" 
// Output hell

পাইপিং সহ:

echo "hello" | php -r "echo substr(trim(fgets(STDIN)), 0, -1);"
// Output hell

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