স্ট্রিংয়ের সামনে থেকে অক্ষরগুলি কীভাবে 'ড্রপ' / মুছবেন?


13

আমার একটি স্ট্রিং রয়েছে যা আমি হেরফের করতে চাই। স্ট্রিংটি হ'ল H08W2345678আউটপুটটি ঠিকঠাক হলে আমি কীভাবে এটি পরিচালনা করতে সক্ষম হব W2345678?

একইভাবে যদি আমি শেষ 4 টি অক্ষর বাদ দিতে চাই H08W2345678যাতে আমি পাই যে আমি এটি H08W234কীভাবে করব?


1
স্ট্রিংগুলি পরিচালনা করার বিভিন্ন উপায় রয়েছে। ব্যবহারের কোনও নির্দিষ্ট কারণ আছে কি sed?
don_crissti

অভিজ্ঞতার অভাব বাদে কোনও কারণ নেই। যে কোনও বিকল্প স্বাগত ...
3kstc

@ ডন_ক্রিসটি, গল্পটি: ফিল্টারড ডাউন সিএসভি ফাইল থেকে, আমি একটি লাইন থেকে প্যারামিটারগুলির একটি নিয়ে থাকি H08W2345678এবং এটির সাথে W2345678এটির মানটিকে অন্য ডেটামের সাথে প্রেরণ করা ইমেলের পাঠানো হবে। আপনার ইমেল ক্রোন দিয়ে হাতে নেওয়া হবে।
3kstc

@don_crissti awkএটা ing। আমি একটি অ্যারে তৈরি করি এবং তারপরে অ্যারের মধ্যে থাকা প্রতিটি উপাদানকে সংশোধন করি (সমস্ত আলাদাভাবে - যেমন সেকেন্ডে ইপোকের টাইমস্ট্যাম্পকে একটি তারিখে পরিবর্তন করুন)
3kstc

2
আপনি awk দিয়ে এর মতো স্টাফ করতে পারেন:printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
don_crissti

উত্তর:


19

কেবল বাশ ব্যবহার করা (বা ksh93যেখানে সিনট্যাক্স আসে বা যেখানে থেকে zsh):

string="H08W2345678"

echo "${string:3}"
W2345678

echo "${string:0:-4}"
H08W234

স্ট্রিং ম্যানিপুলেশন সম্পর্কে আরও জানতে ওউলেজি উইকি দেখুন ।


এর জন্য 4.2 বা তার বেশি বাশ প্রয়োজন। পুরানো সীমাবদ্ধতা দেখতে বাশ রেফারেন্স ম্যানুয়াল, বিভাগের 3.5.3.3, 'শেল প্যারামিটার সম্প্রসারণ' ' বা ছানাগুলির উত্তরটির এই পুরানো অনুলিপিটি দেখুন (" দৈর্ঘ্য শূন্যের চেয়ে বড় বা সমান সংখ্যায় মূল্যায়ন করতে হবে;"); … (চালিয়ে যাওয়া)
স্কট

(চালিয়ে যাওয়া) ... বাশের পরিবর্তনগুলি দেখুন (বাশ হ্যাকারস উইকিতে) (বিভাগের নীচে স্ক্রোল করুন) বা কেস ওয়েস্টার্ন রিজার্ভ ইউনিভার্সিটির প্রযুক্তি অবকাঠামো পরিষেবাদি সংস্থায় বাশ নিউজ (অনুসন্ধান "" বাশ -২.২-এ যুক্ত হয়েছে "অনুসন্ধান করুন) এবং তারপরে পুনর্বিবেচনাটি দেখতে "কি।") এ স্ক্রোল করুন। … ...… ...  "${string:0:${#string}-4}" ব্যাশ সংস্করণে কাজ করে 4.1 যতক্ষণ তার দৈর্ঘ্য $stringকমপক্ষে 4 হয়
স্কট

পিএস এটির মতো স্ট্রিংগুলিতেও দম বন্ধ হয়ে যাবে abc-e, যেখানে আপনি প্রথম তিনটি অক্ষর ফেলে দিলে আপনার সাথে বাকী থাকে -e(কারণ echo -eআপনি যা চান তা করেন না)।
স্কট

8
$ echo "H08W2345678" | sed 's/^.\{3\}//'
W2345678

sed 's/^.\{3\}//'প্রথম তিনটি অক্ষর খুঁজে পেয়ে ^.\{3\}খালি দিয়ে প্রতিস্থাপন করবে। এখানে ^.স্ট্রিংয়ের শুরুতে যে কোনও চরিত্রের সাথে মিল থাকবে (স্ট্রিংয়ের ^সূচনা নির্দেশ করে) এবং \{3\}পূর্ববর্তী প্যাটার্নটি ঠিক 3 বারের সাথে মিলবে। সুতরাং, ^.\{3\}প্রথম তিনটি অক্ষরের সাথে মিলবে।

$ echo "H08W2345678" | sed 's/.\{4\}$//'
H08W234

একইভাবে, sed 's/.\{4\}$//'সর্বশেষ চারটি অক্ষর ফাঁকা দিয়ে প্রতিস্থাপন করবে ( $স্ট্রিংয়ের শেষটি নির্দেশ করে)।


1
আপনি দয়া করে ব্যাখ্যা করতে পারেন 's/^.\{3\}//'এবং 's/.\{4\}$//'আমি এখনও
সেড

@ 3 কেএসটিসি: দয়া করে সম্পাদনাগুলি দেখুন
হিমাইল

1
মাত্র কয়েক অক্ষর জন্য, আমি ব্যবহার করতে চাই ...পরিবর্তে .\{3\}: যেহেতু (রা) আমাকে এটা পড়ার জন্য সহজ এরকম sed -e 's/^...//' -e 's/....$//' বা একটি একক এক্সপ্রেশনে আবর্তনে সঙ্গে sed -r 's/^...|....$//g'। যদি এটি মুছতে কয়েকটি অক্ষরের বেশি হয় তবে আমি এর /.\{17}\/পরিবর্তে অভিব্যক্তিটি ব্যবহার করব /.............../
জনি

স্ট্রিংটি থাকলে -eবা এটি খারাপ আচরণ করবে -n। অবশ্যই, "শেষ 4 অক্ষরগুলি ফেলে দিন" এর অর্থ 4 টি অক্ষরের চেয়ে কম স্ট্রিংয়ের জন্য অপরিবর্তিত, তবে, কেউ যদি প্রথম বা শেষের একটি অক্ষরটি ড্রপ করার জন্য এটি মানিয়ে নিতে চায় তবে এটি ফুঁসে উঠতে পারে।
স্কট

2

আপনার যদি এমন কোনও ফাইল থাকে যেখানে প্রতিটি লাইনটি এগারটি-অক্ষর (বা যাই হোক না কেন) স্ট্রিং যা আপনি কাটাতে চান, sedতা হ'ল সরঞ্জামটি। এটি একটি একক স্ট্রিং ম্যানিপুলেট করার জন্য সূক্ষ্ম, তবে এটি ওভারকিল। একক স্ট্রিংয়ের জন্য, জেসনের উত্তর সম্ভবত সেরা, যদি আপনার কাছে বাশ সংস্করণে 4.2 বা ততোধিক উচ্চতর অ্যাক্সেস থাকে। যাইহোক, এবং সিনট্যাক্সগুলি ব্যাশের জন্য অসাধারণ বলে মনে হচ্ছে (ভাল, বাশ, ksh93, mksh, এবং zsh) - আমি শেল কমান্ড ভাষার জন্য ওপেন গ্রুপ বেস স্পেসিফিকেশনগুলিতে তাদের দেখতে পাচ্ছি না । যদি আপনি কোনও পসিক্স-কমপ্লায়েন্ট শেল দিয়ে আটকে থাকেন যা সাবস্ট্রিং প্রসারণ (নিষ্কাশন) সমর্থন করে না, আপনি ব্যবহার করতে পারেন${parameter:offset}${parameter:offset:length}

$ printf "%s\n" "${string#???}"
W2345678

$ printf "%s\n" "${string%????}"
H08W234

আপনি যখন প্রথম তিনটি অক্ষর ফেলে রাখেন , তার মতো স্ট্রিংগুলি থেকে রক্ষা করার printfপরিবর্তে ব্যবহার করা ( আপনি যা চান তা করেন না)।echoabc-e-eecho -e

এবং, আপনি যদি কোনও বোর্ন-ফ্যামিলি শেলটি ব্যবহার না করেন (বা আপনি একটি প্রাচীন, প্রাক-পসিক্স সিস্টেম ব্যবহার করছেন), এগুলি এখনও কাজ করা উচিত:

$ expr " $string" : ' ...\(.*\)'
W2345678

$ expr " $string" : ' \(.*\)....'
H08W234

অতিরিক্ত নেতৃস্থানীয় স্থান মূল্যবোধের সঙ্গে সমস্যা এড়াতে হয় $string যে প্রকৃত হয় exprঅপারেটার (যেমন, +,  /,  indexবা match) অথবা অপশন (যেমন,  --, --helpবা  --version)।


@ স্টাফেন চেজেলাস: (১) প্রায় ৪০ বছর আগে আমি জানতাম এবং কোনওভাবে ভুলে যেতে পেরেছিলাম এমন একটি ভুলের কথা মনে করিয়ে দেওয়ার জন্য ধন্যবাদ। (২) আমি সর্বদা এটির সাথে সমাধান করতাম X; যেমন expr "X$string" : 'X...\(.*\)',। আইএমও, এটি পড়া এবং বুঝতে সহজ। এতে কোনও সমস্যা আছে, বা কোনও স্থান পছন্দ করার কোনও কারণ আছে? (3) আজ আমি শিখেছি যে expr + "$string" : '...\(.*\)'এখন কাজ করে। আমার মনে নেই 40 বছর আগের কথা; এটি কি যথেষ্ট পরিমাণে সুপারিশ করা নিরাপদ হতে ব্যবহৃত হয়? (৪) আপনি জেসনওয়ারিয়ানর উত্তরের একটি নোট এবং হিমেইলের উত্তরের নীট-পিক মিস করেছেন।
স্কট

আফাইক, এটি expr +কেবল জিএনইউ (সোলারিস বা ফ্রিবিএসডি এএফআইএসএসে কাজ করবে না)। আমি এক্স পরিবর্তে স্থান ব্যবহার করে সম্ভাবনা কম যে কিছু হিসাবে exprবাস্তবায়ন অপারেটার যে সঙ্গে তুলনায় ব্যবধান দিয়ে আরম্ভ হবে xএবং কারণ এটি সম্ভাবনা কম আছে যে উপাদান দিয়ে চেয়ে স্থান দিয়ে শুরু ক্রমানুসারে সাজানো করা x। তবে আমি বুঝতে পারি যে expr " $a" "<" " $b"স্ট্রিং তুলনার জন্য এটি সম্ভবত ভাল পছন্দ নয় কারণ কিছু বাস্তবায়ন সংখ্যার তুলনা করলে $a/ $bসংখ্যার মতো দেখায় comparison আরও expr "@@$a"...বা expr "x $a"নিরাপদ হতে পারে।
স্টাফেন চেজেলাস

0

সঙ্গে:

string="H08W2345678"

3 বা 4 টি অক্ষর মিলে যাওয়া সহজ মনে হয় (বেশিরভাগ শাঁসের জন্য):

$ printf '%s\t%s\n' "${string#???}" "${string%????}"
W2345678      H08W234

পুরানো শেলগুলির জন্য (বোর্ন শেলের মতো), ব্যবহার করুন:

$ string=H08W2345678

$ expr " ${string}" : " ...\(.*\)"
W2345678

$ expr " ${string}" : " \(.*\)...." '
H08W234

যদি এটির জন্য অক্ষরগুলির একটি সংখ্যার গণনা প্রয়োজন হয়, ব্যবহার করুন:

$ expr " ${string}" : " .\{3\}\(.*\)"
W2345678

$ expr " ${string}" : " \(.*\).\{4\}" '
H08W234

অবশ্যই, এই রেজেক্সগুলি সেড, অ্যাজক এবং ব্যাশ 3.0+ এর সাথেও কাজ করে:

$ echo "$string" | sed 's/^.\{3\}//'
W2345678

$ echo "$string" | sed 's/.\{4\}$//'
H08W234

$ echo "$string" | awk '{sub(/^.{3}/,"")}1'
W2345678

$ echo "$string" | awk '{sub(/.{4}$/,"")}1'
H08W234

$ r='^.{3}(.*)$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
W2345678

$ r='^(.*).{4}$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
H08W234

-1

স্ট্রিংয়ের সামনে থেকে অক্ষরগুলি কীভাবে 'ড্রপ' / মুছবেন?

আমার একটি স্ট্রিং রয়েছে যা আমি হেরফের করতে চাই। স্ট্রিংটি H08W2345678 হয় আউটপুটটি কেবল W2345678 হয় তাই আমি কীভাবে এটি ব্যবহার করতে সক্ষম হব?

echo "H08W2345678" | cut -c 4-

এটি কেবল প্রশ্নের অর্ধেক উত্তর দেয়।
কুসালানন্দ

আমি বিশ্বাস করি আপনার ডাউনটা অনুপযুক্ত। এই অর্ধেকটি আমার প্রশ্নের উত্তর দেয় যখন আমি গুগল করেছিলাম যখন আমি পিক্সিক্স প্রথম অক্ষরগুলি সরান এবং এই পৃষ্ঠাটি অনুসন্ধানের ফলাফলগুলিতে প্রদর্শিত হয়েছিল। তদ্ব্যতীত, এই পৃষ্ঠার শিরোনাম প্রশ্নের ঠিক সঠিক অর্ধেকটি কভার করে। আমি যখন ফিরে এসেছি এবং আমি আমার পছন্দ মতো সমাধানটি পেয়েছি তখন অবদান রেখেছিলাম - আমার মনে cutহয় এই পৃষ্ঠায় অন্য যে কোনও কিছু আছে তার চেয়ে আমি এই কাজের জন্য অনেক বেশি মার্জিত।
এক্সেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.