শূন্য-পূরণের সংখ্যাগুলি 2 টি অঙ্কে সেড দিয়ে


19

ইনপুট:

201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG

পছন্দসই আউটপুট:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

0যদি কেবলমাত্র একটি একক সংখ্যা থাকে, যেমন 1"দিনের" অংশে আমি কীভাবে যুক্ত করতে পারি ? আমার এই তারিখের ফর্ম্যাটটি দরকার: ওয়াইওয়াইএমএমডি ডিডি।

উত্তর:


13
$ sed 's/\<[0-9]\>/0&/' ./infile
201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

এটি কীভাবে কাজ করে তা ব্যাখ্যা করতে পারেন? এই প্রথম আমি \<[0-9]\>কনস্ট্রাক্টটি দেখছি যা আমি মনে করি যা একক অঙ্কের সাথে মিলে যাওয়ার জন্য দায়বদ্ধ তবে এই নির্মাণটি কী বলা হয় তা নিশ্চিত নয়। ধন্যবাদ।
সাসুক

2
\ <এর অর্থ: 'শব্দের শুরু' ... [0-9] এর অর্থ 0 থেকে 9 অবধি একক অঙ্ক ... \> এর অর্থ: একটি 'শব্দের' সমাপ্তি ... শব্দ: একটি টোকেন যা সাদা অংশে সীমানা করা হয় (বা যথাক্রমে \ <এবং \> এর জন্য লাইনের শুরু / শেষে শুরু / শেষ হয়) ... পিএস। আমি কেবল বিরাম চিহ্নগুলি চেষ্টা করেছিলাম .. এগুলিও সীমান্তকারী।
পিটার.ও

1
বন্ধনী ক্যাপচার না করে আপনি এটিও করতে পারেন: &প্রতিস্থাপনের স্ট্রিংয়ে sed 's/\<[0-9]\>/0&/'
ম্যাচ করা

ওহ, সচেতন ছিল না যে <>শেল রেজেক্স সিনট্যাক্সের একটি শব্দ সীমানা। এটি ভাবতে আসুন, এমনকি `সেড / এস / \ বি [0-9] \ বি / 0 এবং /'ও কাজ করে। দুজন কেই ধন্যবাদ. :)
সাসুক

@ সাসুক: বর্ধিত রেজেক্সের <>একটি বৈশিষ্ট্য (যেমন শেলের নয়) ... আপনি কোন সংস্করণ এবং কোন বিকল্পগুলি ব্যবহার করেন তার উপর নির্ভর করে এবং উভয়ই প্রসারিত বা স্ট্যান্ডার্ড রেজেক্স ব্যবহার করতে পারে ... স্ট্যান্ডার্ড রেজেক্স ব্যবহার করেsedshell\<\>
পিটার। হে


2

এখানে একটি (অ-sed) ব্যবহারের উপায় ব্যাশ সঙ্গে বর্ধিত Regex ..
, এই পদ্ধতি সুযোগ পৃথক লাইনের আরো জটিল প্রক্রিয়াকরণ করার অনুমতি দিয়েছে। (উদাহরণস্বরূপ, কেবলমাত্র রেগেক্স বিকল্পের চেয়ে বেশি)

while IFS= read -r line ; do
    if [[ "$line" =~ ^(.+\ )([0-9]\ .+)$ ]]  
    then echo "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}" 
    else echo "$line"
    fi
done <<EOF
201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG
EOF

আউটপুট:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

1

আমি এরকম কিছু করব:

sed -E 's/ ([0-9]) / 0\1 /' ./input

এটি নিঃসঙ্গ সংখ্যাগুলিকে ধরবে, তাদের একটি গোষ্ঠীর সাথে শ্বেত ' ([0-9]) 'স্থান থেকে আলাদা করবে , তারপরে এগুলিকে 0 এবং হোয়াইটস্পেস প্যাডিং সহ ফিরে রাখবে ' 0\1 '

-Eবিকল্প (তাই আপনি ব্যবহার করতে হবে না উপর ওএসএক্স আধুনিক Regex এক্সপ্রেশন জন্য করতে পারবেন "\"তাই প্রায়ই), -rলিনাক্স সিস্টেম আমি পরীক্ষিত করেছেন তার উপরে একই জিনিস আছে।


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