একটি স্ট্রিংয়ের অবস্থানের উপর ভিত্তি করে নেতৃস্থানীয় জিরোগুলির একটি চলক সংখ্যার যোগ করার জন্য একটি বর্ধিত রেজিএক্সএক্স বাস্তবায়ন করা


10

একটি সাংখ্যিক সাংগঠনিক স্কিমে বিভিন্ন সংখ্যক শীর্ষস্থানীয় জিরো যুক্ত করতে আমার সিড সিনট্যাক্স নামাতে আমার সমস্যা হচ্ছে। আমি যে স্ট্রিংগুলি চালাচ্ছি সেগুলি প্রদর্শিত হবে

1.1.1.1,Some Text Here

সেড সিনট্যাক্সের উপকার

sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"

আমি প্রতিক্রিয়া প্রকাশ করতে সক্ষম

01.01.01.01,Some Text Here

যাইহোক, আমি যা খুঁজছি তা ক্ষেত্রের 2 এবং 3 এবং 3 ক্ষেত্রের 2 অঙ্কের শূন্য-পূরণের জন্য এমন কিছু যা যাতে সমস্ত আইটেমের মান [0-9] হয় [[0-9] { 2}। [0-9] {2}। [0-9] {3}

1.01.01.001,Some Text Here

আমার জীবনের জন্য আমি পিরিয়ডকে শুধুমাত্র সংখ্যায় স্ন্যাপ করার জন্য প্রয়োজনীয় প্যারামিটারগুলি অন্তর্ভুক্ত করার জন্য কীভাবে সীমানা পরিবর্তন করতে পারি তাও বুঝতে পারি না। আমি মনে করি এটি একটি শব্দের সীমানায় শূন্য অক্ষরের সাথে ম্যাচগুলি বোঝে \ বি এর ব্যবহারের সাথে কিছু যুক্ত রয়েছে তবে আমি বুঝতে পারি না কেন আমার ম্যাচে পিরিয়ড যুক্ত করার চেষ্টাটি ব্যর্থ হয়েছে:

sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr"
Both cause the statement to hang

sed -r ":r;s/\b[0-9]\.{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\.\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\b\./0&/g;tr"
cause the statement to output:

1.01.01.1,Some Text Here

অতিরিক্ত হিসাবে, আমি প্রত্যাশা করি যে বিবৃতিতে যেমন পাঠ্য থাকলে আমার অতিরিক্ত সমস্যা হবে:

1.1.1.1,Some Number 1 Here

এটি একটি পূর্বাবস্থায় উপসংহার যে আমার সত্যিকারের সেড এবং এর সমস্ত জটিলতা শিখতে হবে। আমি এটি নিয়ে কাজ করছি, তবে আশা করি এই নির্দিষ্ট বিবৃতিটি কিছু সময়ের জন্য আমাকে সমস্যার কারণ হতে থাকবে। কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।

সম্পাদনা: আমি একটি উপায় খুঁজে বের করেছি ... এই বিবৃতিটি আমি যা খুঁজছি তা মনে হচ্ছে, তবে এটি করার আরও একটি দুর্দান্ত উপায় হতে পারে।

sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'

এছাড়াও, সিন্ট্যাক্টিক্যালি সমস্যাটি সৃষ্টি করবে যদি পাঠ্যে একই ধরণের সংখ্যার ফর্ম্যাট উপস্থিত হয় ... এর মতো:

1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3

যা ক্ষেত্রে এটি ফলাফল:

1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03

সমাধান আপনার সহায়তার জন্য এখানে সবাইকে ধন্যবাদ। আমি প্রথমে নীচে আমি গৃহীত উত্তর দিয়ে সমস্যার সমাধান করেছি। আমি বুঝতে পেরেছি যে সমাধানটি নীচের বাছাই করে আরও বড় সমাধানের অংশ হিসাবে পাইথনে স্থানান্তরিত করেছি:

def getPaddedKey(line):
    keyparts = line[0].split(".")
    keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
    return '.'.join(keyparts)

s=sorted(reader, key=getPaddedKey)

এটি আমি যা খুঁজছি তা করার জন্য মনে হচ্ছে: sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//' তবে, আরও সুন্দর মার্চিকেশন আছে কিনা তা আমি জানতে আগ্রহী।
দাইজিই

1
স্ট্রেঞ্জলি, স্ট্রিং reversing, আবেদন trailing শূন্য, এবং তারপর ফলাফলের reversing আরো সহজে আপনার লক্ষ্য অর্জন করতে পারে।
রোয়াইমা

2
ব্যবহার printf(বা একটি printfawk মধ্যে কল) আরো সহজবোধ্য হতে পারে।
ওয়াইল্ডকার্ড

1
এটি অবশ্যই এমন কিছু যা ভবিষ্যতে অর্ক বা পার্ল (বা প্রিন্টফ এবং সহজ ক্ষেত্র বিভাজনযুক্ত এমন আরও কিছু) ভাষায় ভবিষ্যতে বাস্তবায়ন, পড়া, বুঝতে এবং সংশোধন করা সহজ হবে।
ক্যাস

1
@ উইল্ডকার্ড - পয়েন্ট ভালভাবে নেওয়া হয়েছে। আপনি কি আমাকে ডিবাগিং সেড সম্পর্কে কিছুতে নির্দেশ করতে পারেন? সাধারণত, আমি দীর্ঘায়িত অনাহারে অবলম্বন করি এক্সপ্লোটিভদের দ্বারা বিরতিযুক্ত। ;) এগুলি বাদ দিয়ে আমি মাঝে মাঝে ছোট্ট টুকরো টুকরো টুকরো টুকরো করে ফেলে এবং প্রত্যেককে আবার যুক্ত করার আগে কাজ করার চেষ্টা করি। আমি সম্প্রতি একটি দুর্দান্ত টিউটোরিয়াল github.com/learnbyexample/Command-line-text-processing/blob/… পড়েছি এবং আমি নিশ্চিত যে দীর্ঘায়িত না দেখার জন্য কিছু উদাহরণ ভুল ছিল।
জো

উত্তর:


4

ব্যবহার: leading_zero.sh input.txt

#!/bin/bash

sed -r '
    s/\.([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{1,3},)/.0\1.0\2.00\3/
    s/\.0*([0-9]{2})\.0*([0-9]{2})\.0*([0-9]{3})/.\1.\2.\3/
' "$1"

ব্যাখ্যা:

  1. প্রথম সাবট্যটিউশন প্রতিটি সংখ্যায় নির্দিষ্ট পরিমাণ শূন্য যুক্ত করে। 1 শূন্য থেকে 2 এবং 3 নম্বর, 2 শূন্য থেকে 4 নম্বর। ইতিমধ্যে কতগুলি সংখ্যা রয়েছে তাতে কিছু আসে যায় না।
  2. দ্বিতীয় বিকল্পগুলি কেবলমাত্র প্রয়োজনীয় পরিমাণ সংখ্যা রেখে সমস্ত অতিরিক্ত শূন্যগুলি সরিয়ে দেয়। 2 এবং 3 সংখ্যায় কেবল 2 টি সংখ্যা থাকা উচিত। তাদের ছেড়ে দেয় এবং বিশ্রামগুলি সরিয়ে দেয়। চতুর্থ সংখ্যাটিতে কেবল 3 টি সংখ্যা থাকতে হবে। তাদের ছেড়ে দেয় এবং বিশ্রামগুলি সরিয়ে দেয়।

input.txt

1.1.1.1,Some Text Here
1.1.1.1,Some Text Here
1.11.1.11,Some Text Referring to Document XXX Heading 1.2.3
1.1.1.1,Some Text Here
1.1.11.111,Some Text Referring to Document XXX Heading 1.2.3
1.11.1.1,Some Text Here

output.txt

1.01.01.001,Some Text Here
1.01.01.001,Some Text Here
1.11.01.011,Some Text Referring to Document XXX Heading 1.2.3
1.01.01.001,Some Text Here
1.01.11.111,Some Text Referring to Document XXX Heading 1.2.3
1.11.01.001,Some Text Here

শেষের দিকে যখন আমি ব্যয় করার জন্য পাইথনে এটি স্ক্রিপ্টিংটি শেষ করেছি, তবে আমার এই প্রশ্নের উত্তরের উত্তরটি লিখিত হিসাবে দেওয়া হয়েছে যে পার্ল পূর্বে জমা দেওয়া আউটপুট থেকে সরানো ব্যাকস্ল্যাশগুলি (কমপক্ষে) জমা দেওয়া হয়েছিল। এটি 1. একটি সেড দ্রবণ এবং ২. পাঠ্যের শ্লীলতাহত না করে সঠিক আউটপুট তৈরি করে। উত্তর হিসাবে চিহ্নিত করা হচ্ছে। ধন্যবাদ! :-)
দৈজিজাই

@ ডাইজিযাই যেমন আমি ইতিমধ্যে দেখিয়েছি, perlসংস্করণটি ব্যাকস্ল্যাশগুলি সরিয়ে দেয় না।
রোয়াইমা

9

বাশ এটি পরিচালনা করতে পারে। পার্লের তুলনায় এটি অনেক ধীর হবে:

echo "1.1.1.1,Some Text Here" | 
while IFS=., read -r a b c d text; do
    printf "%d.%02d.%02d.%03d,%s\n" "$a" "$b" "$c" "$d" "$text"
done
1.01.01.001,Some Text Here

2
বা আওক। কিন্তু printfবোধগম্য সরঞ্জামটি ব্যবহারের জন্য +1 । ( টেক্সট প্রসেসিংয়ের printfচেয়ে আওকটিও তৈরি করেছেন এবং এটি আরও ভালভাবে ডিজাইন করেছেন bash)) এছাড়াও দেখুন দেখুন কেন পাঠকে খারাপ অনুশীলন হিসাবে বিবেচনা করা প্রক্রিয়ায় শেল লুপ ব্যবহার করা হচ্ছে?
ওয়াইল্ডকার্ড

5

আপনি সুনির্দিষ্টভাবে perlসমাধানের জন্য বলেন নি তবে যাইহোক এখানে একটি সমাধান রয়েছে। ব্যক্তিগতভাবে আমি মনে করি এটি পড়া সহজ, বিশেষত যখন কয়েকটি লাইনে বিভক্ত হয়।

প্রথমে এখানে ওয়ান-লাইনার রয়েছে:

(
    echo '1.2.3.4,Some Text Here'
    echo '1.01.01.1,Some Text Here'
    echo '1.1.1.1,Some Number 1 Here'
    echo '1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3'
    echo '1.2.3.4,Some \n \s \text'
) |
perl -ne '($ip, $text) = split(/,/, $_, 2); $ip = sprintf("%1d.%02d.%03d.%03d", split(/\./, $ip)); print "$ip,$text"'

এর ফলাফল:

1.02.003.004,Some Text Here
1.01.001.001,Some Text Here
1.01.001.001,Some Number 1 Here
1.01.001.001,Some Text Referring to Document XXX Heading 1.2.3
1.02.003.004,Some \n \s \text

এবং এখানে perlস্ক্রিপ্টটি ভেঙে দেওয়া এবং মন্তব্য করা হয়েছে ( -nপতাকাটি while read; do ... doneকোডের চারপাশে একটি অন্তর্ভুক্ত লুপ রাখে ):

($ip, $text) = split(/,/, $_, 2);                # Split line into two parts by comma
@octets = split(/\./, $ip)                       # Split IP address into octets by dots
$ip = sprintf("%1d.%02d.%03d.%03d", @octets);    # Apply the formatting
print "$ip,$text"                                # Output the two parts

হাস্যকরভাবে, আমি যখন আপনি এটি পোস্ট করেছিলেন তখন আমি কেবল হাল ছেড়ে দিতে এবং অবাক হয়ে যাব। মনে হচ্ছে বিলে মানায়। আমি এটি পরীক্ষা করে ফিরে আসব।
দাইজিঁই

@ ডাইজিযাই awkখুব কাজে লাগবে - একই নীতিটি ব্যবহার করেprintf
রোয়াইমা

কেবলমাত্র এটিই ব্যর্থ হয় যা আমি অনুমান করতে পারি না, তবে তা তাৎপর্যপূর্ণ। এটি টেক্সট অংশ থেকে ব্যাকস্ল্যাশ ফেলা বলে মনে হচ্ছে।
দাইজিঁই

@ ডাইজিযাই এখানে নেই। আপনি কীভাবে এটি ব্যাকস্ল্যাশ দিয়ে পাঠ্য খাওয়াচ্ছেন? আমি আপনার জন্য একটি ব্যাকস্ল্যাশড উদাহরণ যোগ করেছি
রোয়াইমা

আমার অভ্যন্তরীণ ডেটাসেটের সাথে আমার ব্যবহারে কিছু পাঠ্য কলামের সাথে সারি রয়েছে যাতে কিছু \ পাঠ্য \ পারে \ হতে পারে \ এখানে \ 4 রিলিজের মতো স্ট্রিং রয়েছে। এই ডেটাসেটটি যখন পার্ল স্টেটমেন্টে পৌঁছেছে তখন এটির ফলাফল হিসাবে সোমটেক্সটমাইটবিহ্যারে ৪ রিলিজ
দাইজিই

3

এখানে একটি সম্ভাব্য পন্থা:
sed -E 's/([0-9]*\.)/0\1/g;s/.//;s/([0-9]*,)/00\1/'

উদাহরণ

echo "1.11.111.1111,Some Text Here" | sed -E 's/([0-9]*\.)/0\1/g;s/.//;s/([0-9]*,)/00\1/'
1.011.0111.001111,Some Text Here

এই স্ট্রিংয়ের সাথেও কাজ করুন:

echo "1.1.1.1,Some Number 1 Here" | sed -E 's/([0-9]\.)/0\1/g;s/.//;s/([0-9],)/00\1/'
1.01.01.001,Some Number 1 Here

... এবং এই স্ট্রিং:

echo "1.2.2101.7191,Some Text Here" | sed -E 's/([0-9]*\.)/0\1/g;s/.//;s/([0-9]*,)/00\1/'
1.02.02101.007191,Some Text Here

দুর্ভাগ্যক্রমে অঙ্কগুলি আরোহণের সাথে সাথে এটি ভেঙে যায়। উদাহরণস্বরূপ: 1.1.11.111, এখানে কিছু পাঠ্য হয়ে উঠেছে: 1.1.101.11001, কিছু পাঠ্য এখানে
ডাইজিঁই

@ ডাইজিযাই দয়া করে আমার সম্পাদনা দেখুন। এটি কি প্রয়োজন পূরণ করবে?
17

দুর্ভাগ্যক্রমে নয়, তবে আমি মনে করি এটি আমার দোষ হতে পারে। শূন্য-পূরণের ক্ষেত্রের ক্ষেত্রের 2 এবং 3 এবং 3 অঙ্কের দুটি অঙ্কের আপ হওয়া দরকার Es মূলত [0-9] [[0-9] {2}। [0-9] {2}। [0 -9] {3}, এখানে কিছু পাঠ্য
দাইজাই

2
perl -pe '/^\d/g && s/\G(?:(\.\K\d+(?=\.))|\.\K\d+(?=,))/sprintf "%0".($1?2:3)."d",$&/ge'

ব্যাখ্যা:

এখানে ব্যবহৃত পদ্ধতিটি হ'ল সংখ্যার পাড়াগুলি দেখে এবং তার উপর ভিত্তি করে পদক্ষেপ নেওয়া। সুতরাং, ২ য় এবং তৃতীয় সংখ্যা উভয় পক্ষের একটি বিন্দু দেখতে পাবে যেখানে চতুর্থ সংখ্যাটি বামদিকে ডট এবং ডানদিকে একটি কমা রয়েছে a

Ge 1 সেট করা হয় যখন রেজেক্স 2 য় বা 3 য় নম্বরের পথে নেয় এবং ততক্ষণে যথার্থ প্যাডিং 2 হয় O 4 ও 4 নম্বরের জন্য প্যাডিং 3 হয়।

% বিড়াল file.txt

1.00.3.4,Some Text Here
1.01.01.1,Some Text Here
1.0.01.1,Some Number 1 Here
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3.4
1.2.3.4,Some \n \s \text

ফলাফল:

1.00.03.004,Some Text Here
1.01.01.001,Some Text Here
1.00.01.001,Some Number 1 Here
1.01.01.001,Some Text Referring to Document XXX Heading 1.2.3.4
1.02.03.004,Some \n \s \text
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.