উদাহরণস্বরূপ, প্রদত্ত:
USCAGoleta9311734.5021-120.1287855805
আমি কেবল নিষ্কাশন করতে চাই:
US
উদাহরণস্বরূপ, প্রদত্ত:
USCAGoleta9311734.5021-120.1287855805
আমি কেবল নিষ্কাশন করতে চাই:
US
উত্তর:
সম্ভবত সবচেয়ে কার্যকর পদ্ধতি, যদি আপনি bash
শেলটি ব্যবহার করেন (এবং আপনি আপনার মন্তব্যের উপর ভিত্তি করে উপস্থিত হন), প্যারামিটার বিস্তারের সাব-স্ট্রিং বৈকল্পিকটি ব্যবহার করা:
pax> long="USCAGol.blah.blah.blah"
pax> short="${long:0:2}" ; echo "${short}"
US
এটি short
প্রথম দুটি চরিত্র হতে সেট করবে long
। যদি long
দুটি চরিত্রের চেয়ে কম short
হয় তবে এটির জন্য অভিন্ন হবে।
শেল-ইন-শেল পদ্ধতিটি সাধারণত ভাল হয় যদি আপনি এটি প্রচুর পরিমাণে করতে যাচ্ছেন (প্রতিবেদনের প্রতি 50,000 বারের মতো) যেহেতু কোনও প্রক্রিয়া ওভারহেড নেই। বাহ্যিক প্রোগ্রামগুলি ব্যবহার করে এমন সমস্ত সমাধান সেই ওভারহেডে ভুগবে।
আপনি যদি ন্যূনতম দৈর্ঘ্যও নিশ্চিত করতে চেয়েছিলেন তবে আপনি আগে এমন কিছু দিয়ে তা প্যাড করতে পারেন:
pax> long="A"
pax> tmpstr="${long}.."
pax> short="${tmpstr:0:2}" ; echo "${short}"
A.
এটি নিশ্চিত করবে যে দৈর্ঘ্যের দুটি অক্ষরের চেয়ে কম যে কোনও কিছুকে পিরিয়ড সহ ডানদিকে প্যাড করা হয়েছিল (বা অন্য কিছু, ঠিক তৈরির সময় ব্যবহৃত চরিত্রটি পরিবর্তন করে tmpstr
)। আপনার এটি প্রয়োজন তা পরিষ্কার নয় তবে আমি ভেবেছিলাম এটি সম্পূর্ণতার জন্য রেখে দেব।
এটি বলার পরেও, বাহ্যিক প্রোগ্রামগুলির সাথে এটি করার অনেকগুলি উপায় রয়েছে (যেমন যদি আপনার কাছে bash
উপলব্ধ না থাকে ), এর কয়েকটি হল:
short=$(echo "${long}" | cut -c1-2)
short=$(echo "${long}" | head -c2)
short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}'
short=$(echo "${long}" | sed 's/^\(..\).*/\1/')
প্রথম দুটি ( cut
এবং head
) একক লাইন স্ট্রিংয়ের জন্য অভিন্ন - এগুলি মূলত উভয়ই আপনাকে প্রথম দুটি অক্ষর ফিরিয়ে দেয়। এগুলির মধ্যে এটির ভিন্নতা cut
আপনাকে প্রতিটি লাইনের head
প্রথম দুটি অক্ষর দেবে এবং আপনাকে পুরো ইনপুটটির প্রথম দুটি অক্ষর দেবে
তৃতীয়টি awk
প্রথম দুটি অক্ষর নিষ্কাশন করতে সাব-স্ট্রিং ফাংশন sed
ব্যবহার করে ()
এবং চতুর্থটি প্রথম দুটি অক্ষর ক্যাপচারের জন্য ক্যাপচার গ্রুপগুলি (ব্যবহার করে \1
) ব্যবহার করে এবং তাদের সাথে পুরো লাইনটি প্রতিস্থাপন করে। এগুলি উভয়ের মতোই cut
- তারা ইনপুটটিতে প্রতিটি লাইনের প্রথম দুটি অক্ষর সরবরাহ করে।
আপনার ইনপুটটি একটি একক লাইন কিনা তা নিশ্চিত হয়ে থাকলে সেগুলির মধ্যে কোনওটিই বিবেচনা করে না, সেগুলির একটিরই অভিন্ন প্রভাব রয়েছে।
printf '%s'
পরিবর্তে echo
ক্ষেত্রে সেখানে স্ট্রিং অদ্ভুত অক্ষর আছেন: stackoverflow.com/a/40423558/895245 POSIX জন্য অন্ধকারাচ্ছন্ন: head -c
POSIX নয়, cut -c
এবং awk substr
হয়, sed \1
নিশ্চিত না।
সবচেয়ে সহজ উপায়
${string:position:length}
যেখানে এ $length
থেকে সাবস্ট্রাক্ট ।$string
$position
এটি একটি বাশ অন্তর্নির্মিত তাই তাই বাজে বা শেড প্রয়োজন হয় না।
আপনি বেশ কয়েকটি ভাল উত্তর পেয়েছেন এবং আমি নিজেই বাশ বিল্টিনের সাথে যাব, তবে আপনি যেহেতু জিজ্ঞাসা করেছিলেন sed
এবং awk
এবং ( প্রায় ) অন্য কেউ তাদের ভিত্তিতে সমাধানের প্রস্তাব দেয় না, আমি আপনাকে এই অফার দিচ্ছি:
echo "USCAGoleta9311734.5021-120.1287855805" | awk '{print substr($0,0,2)}'
এবং
echo "USCAGoleta9311734.5021-120.1287855805" | sed 's/\(^..\).*/\1/'
awk
এক মোটামুটি সুস্পষ্ট করা কর্তব্য, কিন্তু এখানে একটি ব্যাখ্যা আছে sed
এক:
substr($0,1,2)
।
আপনি যদি ভিতরে থাকেন তবে আপনি bash
বলতে পারেন:
bash-3.2$ var=abcd
bash-3.2$ echo ${var:0:2}
ab
এটি আপনার প্রয়োজন কেবল হতে পারে ...
শুধু গ্রেপ:
echo 'abcdef' | grep -Po "^.." # ab
-P
এটি সংক্ষিপ্ত করার বিকল্পটি আপনি মুছে ফেলতে পারেন । সমস্ত রেজেক্সগুলি সেই প্যাটার্নটি বুঝতে পারবে।
আপনি ব্যবহার করতে পারেন printf
:
$ original='USCAGoleta9311734.5021-120.1287855805'
$ printf '%-.2s' "$original"
US
কলারম - একটি ফাইল থেকে কলামগুলি সরান
প্রথম দুটি অক্ষর ছেড়ে যেতে, কেবল 3 থেকে শুরু করে কলামগুলি সরিয়ে ফেলুন
cat file | colrm 3
বেশ দেরিতে আসলেই কিন্তু এখানে
sed 's/.//3g'
অথবা
awk NF=1 FPAT=..
অথবা
perl -pe '$_=unpack a2'
আপনি যদি শেল স্ক্রিপ্টিং ব্যবহার করতে চান এবং নন-পিক্সিক এক্সটেনশনগুলিতে (যেমন তথাকথিত বাশিজম) উপর নির্ভর না করে থাকেন তবে আপনি এমন কৌশল ব্যবহার করতে পারেন যেগুলি গ্রিপ, সেড, কাট, অ্যাজক ইত্যাদির মতো বাহ্যিক সরঞ্জামগুলি কাঁটাচামচ করার প্রয়োজন হয় না, যা পরে আপনার স্ক্রিপ্ট কম দক্ষ করুন। আপনার দক্ষতা এবং পিক্সের বহনযোগ্যতা আপনার ব্যবহারের ক্ষেত্রে গুরুত্বপূর্ণ নয়। তবে এটি (বা কেবল একটি ভাল অভ্যাস হিসাবে) ক্ষেত্রে, আপনি শেল ভেরিয়েবলের প্রথম দুটি অক্ষর নিষ্কাশন করতে নিম্নলিখিত প্যারামিটার সম্প্রসারণ বিকল্প পদ্ধতিটি ব্যবহার করতে পারেন :
$ sh -c 'var=abcde; echo "${var%${var#??}}"'
ab
প্রথম দুটি অক্ষর (এটি অংশ) মুছে ফেলার জন্য এটি "ক্ষুদ্রতম উপসর্গ" পরামিতি সম্প্রসারণ ব্যবহার করে ${var#??}
, তারপরে "ক্ষুদ্রতম প্রত্যয়" পরামিতি সম্প্রসারণ ( ${var%
অংশ) সেই সমস্ত-তবে-প্রথম-দুটি-অক্ষরের স্ট্রিংটি মূল থেকে সরান মান।
এই পদ্ধতিটি পূর্বে "শেল = উত্তর দিয়ে ভেরিয়েবল #" দিয়ে শুরু হয় কিনা তা এই উত্তরটিতে বর্ণিত ছিল । এই উত্তরটি কয়েকটি দু'জনের অনুরূপ প্যারামিটার সম্প্রসারণের পদ্ধতিও বর্ণনা করে যা এখানে কিছুটা ভিন্ন প্রসঙ্গে ব্যবহার করা যেতে পারে যা এখানে মূল প্রশ্নের ক্ষেত্রে প্রযোজ্য।
আপনার সিস্টেমে একটি ভিন্ন শেল (শুধুমাত্র ব্যবহার করা হয়, তাহলে bash
), কিন্তু আপনার সিস্টেম আছে bash
, তাহলে আপনি এখনও সহজাত স্ট্রিং ম্যানিপুলেশন ব্যবহার করতে পারেন bash
আবাহন করার মাধ্যমে bash
একটি পরিবর্তনশীল সঙ্গে
strEcho='echo ${str:0:2}' # '${str:2}' if you want to skip the first two characters and keep the rest
bash -c "str=\"$strFull\";$strEcho;"
কেবল মজাদার উদ্দেশ্যেই ইল কয়েকটি যোগ করুন, যদিও এগুলি জটিল এবং অকেজো হয়ে গেছে, তাদের উল্লেখ করা হয়নি:
head -c 2 <( echo 'USCAGoleta9311734.5021-120.1287855805')
echo 'USCAGoleta9311734.5021-120.1287855805' | dd bs=2 count=1 status=none
sed -e 's/^\(.\{2\}\).*/\1/;' <( echo 'USCAGoleta9311734.5021-120.1287855805')
cut -c 1-2 <( echo 'USCAGoleta9311734.5021-120.1287855805')
python -c "print(r'USCAGoleta9311734.5021-120.1287855805'[0:2])"
ruby -e 'puts "USCAGoleta9311734.5021-120.1287855805"[0..1]'
যদি মাইস্ট্রিং = ইউএসসিএজিওলেটা 9311734.5021-120.1287855805
print substr(mystring,0,2)
মার্কিন মুদ্রণ হবে
যেখানে 0 হল শুরুর অবস্থান এবং 2 হল মেনী চরগুলি কীভাবে পড়তে হয়
awk
। দুঃখিত, আমি প্রথমে বলতে পারিনি।
এই কি আপনার পরে?
my $string = 'USCAGoleta9311734.5021-120.1287855805';
my $first_two_chars = substr $string, 0, 2;
রেফ: সাবস্ট্রিট
perl -e 'print substr $ARGV[0], 0, 2' 'USCAGoleta9311734.5021-120.1287855805'