স্ট্রিংয়ে একটি নতুন লাইনের চরিত্র রয়েছে এবং কীভাবে তা স্থির করা যায়, যদি তা থাকে তবে তা মুছে ফেলুন


9

আমার একটি স্ট্রিং রয়েছে যা কিছু অপারেশনের ফলাফল যা আমার কোনও নিয়ন্ত্রণে নেই। আমি যখন এই ভেরিয়েবলটি ব্যবহার করে মুদ্রণ করি তখন আমি echoপাই:

echo $myvar
hello

যাইহোক, আমি যখন না

if [ $myvar = "hello" ]; then
    echo they are equal
else
    echo they are not equal
fi

আমি সর্বদা পাই যে তারা সমান নয়। আমি সন্দেহ করি এটি একটি newlineচরিত্রের কারণেই ।

স্ট্রিংটিও আশ্চর্যের সাথে আচরণ করে। যখন আমি করি:

newVAR="this is my var twice: "$myvar$myvar
echo $newVAR

আমি পাই:

hellois my var twice: hello

এটি আসলে newlineএবং এটির কারণে আসলে এটি আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি ?


1
বাশে আপনি printf '%q\n' "$string"যে কোনও স্ট্রিংয়ের একটি পালিয়ে যাওয়া সংস্করণ পেতে পারেন । যেমন: printf '%q\n' 'foo\n'-> foo\\n; printf '%q\n' $'foo\n'->$'foo\n'
l0b0

1
আপনি আপনার কোনও ভেরিয়েবলের বিস্তৃতি উদ্ধৃত করছেন না। যদি তাদের কোনও পেছনের শ্বেত স্থান থাকে তবে আপনি এটিটি দেখতে পাবেন না echo $foo। কি echo "$foo"পরিবর্তে।
পিটার কর্ডেস

উত্তর:


9

সমস্যাটি হ'ল আপনার এম্বেড থাকা ক্যারেজ-রিটার্ন (সিআর, \r) রয়েছে। এটি টার্মিনাল পাঠ্য সন্নিবেশ বিন্দুটি মুদ্রণ করে রেখার শুরুতে ফিরে আসতে বাধ্য করে। এ কারণেই আপনি $newVARউদাহরণটিতে লাইনের শুরুতে 'হ্যালো' দেখছেন - sed -n lঅ-মুদ্রণযোগ্য অক্ষরগুলির একটি পাঠযোগ্য দৃশ্য (এবং লাইনের শেষ) প্রদর্শন করে।

var=ab$'\r'c ; echo "$var";  printf %s "$var" | sed -n l
# output:
cb
ab\rc$

আপনি এটির জন্য একটি সাধারণ বাশ শর্ত পরীক্ষা করে পরীক্ষা করতে পারেন:

[[ $var == *$'\r'* ]] && echo yes || echo no
# output:
yes

আপনি পরীক্ষা একত্রিত করতে পারেন এবং এর মাধ্যমে পরীক্ষা করে এবং \rএর মাধ্যমে তাদের সরানোর মাধ্যমে এক ধাপে ঠিক করতে পারেন :

fix="${var//$'\r'/}"; echo "$var"; echo "$fix"
# output:
cb
abc

ফিক্স ব্যবহার শেল প্যারামিটার সম্প্রসারণ । উপরে ব্যবহৃত বিশেষ ফর্মটি আপনার প্রোভিডেড প্যাটার্নের উপর ভিত্তি করে সাবস্ট্রিংগুলি প্রতিস্থাপনের জন্য: ${parameter/pattern/string}<- এটি কেবলমাত্র প্রথম পাওয়া প্যাটার্নটি পরিবর্তিত * প্যারামিটারের স্ট্রিংয়ের সাথে প্রতিস্থাপন করে । সমস্ত নিদর্শন প্রতিস্থাপন করতে , আপনাকে কেবল প্রথমে পরিবর্তন /করতে হবে //


আপনি কি আপনার শেষ বিট কোড ব্যাখ্যা করতে পারেন? fix="....লাইন?
farid99

@ ফরিড৯৯: উত্তরে উত্তর যুক্ত করা হয়েছে, নোটটি নিজেই fixহতে varপারে - বা প্রায়শই আপনি কেবলমাত্র প্যারামিটারের বিস্তৃতিটি ব্যবহার করতে পারেন যেমন (সম্ভবত) পরিবর্তিত মানটিকে পুনরায় সাইন ইন করার প্রয়োজন নেই ..
পিটার.ও

5

আপনি ব্যাশে \rযেমন উপস্থাপন করতে পারেন $'\r':

if [ "$myvar" = "hello"$'\r' ]; then
    echo they are equal
else
    echo they are not equal
fi

অথবা শেষ কাটতে \rমধ্যে myvar:

if [ "${myvar%$'\r'*}" = "hello" ]; then
    echo they are equal
else
    echo they are not equal
fi

3

কৌতূহলজনকভাবে, অনেকগুলি শেলের getoptsমধ্যে এই জাতীয় কোনও কাজের সম্ভাব্য প্রার্থী। এটি প্রথমে বিপরীতমুখী মনে হতে পারে, তবে আপনি যদি বিবেচনা করেন যে getopts'প্রাথমিক কাজটি হ'ল একটি নির্দিষ্ট অক্ষর কমান্ড-লাইন বিকল্প হিসাবে চিহ্নিত হওয়া এবং এটির একটি সংক্ষিপ্ত সিরিজে পাওয়া যেতে পারে তত ব্যাখ্যার জন্য উপস্থাপিত করা, এটি কিছুটা তৈরি করা শুরু করতে পারে আরো ধারনা.

bashশেল থেকে, প্রদর্শন করতে :

x=$(printf '\n\r%010s\t' hello)
OPTIND=1
while  getopts : na "-$x"
do     printf %q\\n "$OPTARG"
done

$'\n'
$'\r'
\
\
\
\
\
h
e
l
l
o
$'\t'

এইভাবে কখনও কখনও getoptsএই জাতীয় ক্ষেত্রে যেমন একরকম শেল অটো-পাইলট হিসাবে বিচ্ছিন্নতা পরিচালনা করতে দেওয়া সুবিধাজনক হতে পারে । আপনি যখন এটি করেন, আপনি কেবল অযাচিত বাইটগুলি ডাব্লু / এ পরীক্ষা করতে পারেন caseবা বাইট 1 থেকে আপনার স্ট্রিং ব্যাক-আপ তৈরি করতে পারেন:[]

OPTIND=1 y=$(printf \\n\\r) z=
while  getopts : na "-$x"
do     case $OPTARG in ([!$y])
            z=$z$OPTARG
       esac
done
printf %q\\n "$z"

$'     hello\t'

এই সাধারণ উদাহরণস্বরূপ ক্ষেত্রে - এবং একটি শেল দেওয়া হয়েছে যা ইতিমধ্যে অন্য কোথাও উল্লিখিত প্যারামিটার সম্প্রসারণকে সমর্থন করে - বলেছে যে বিস্তৃতি সম্ভবত এখানে আপনাকে আরও ভালভাবে পরিবেশন করবে। তবে আমি ভেবেছিলাম যে getoptsআপনি যদি এই ক্ষেত্রে এর দক্ষতা সম্পর্কে অবগত না হন তবে আপনি অবশ্যই উল্লেখ করার মতো মূল্যবান হতে পারেন। অবশ্যই যখন আমি এটি জানতে পেরেছিলাম তবে এর জন্য আমি অনেক দরকারী অ্যাপ্লিকেশন পেয়েছি।


0

বাশ এবং অন্যান্য শেল ভাষা কার্যকর থাকলেও কখনও কখনও পার্লের মতো সত্যিকারের স্ক্রিপ্টিং ভাষা ব্যবহার করা আরও ভাল। পার্ল শেল স্ক্রিপ্টগুলি প্রতিস্থাপন করতে পারে যা অন্যান্য ভাষায় যেমন শেড এবং অ্যাজকের পাশাপাশি ইউনিক্স কমান্ডগুলি খুব সহজে কল করে। ফরট্রান কোড কল করার আগে আমি এই 20+ বছর আগে সি-শেল স্ক্রিপ্টগুলি লেখার সময় শিখেছিলাম যার পরিবর্তে সেড, অজ, এবং বিভিন্ন ইউনিক্স কমান্ড নামে পরিচিত। পার্লে আমি করব:

chomp($myvar);   # removes the newline char

if("$myvar" eq "hello")   # string comparison
  {
  print "they are equal\n";
  }
else
  {
  print "they are not equal\n";
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.