উত্তর:
এটির কাজ করার মূল চাবিকাঠিটি হ'ল আপনি sed
কী আউটপুট হতে চান না তা বাদ দেওয়ার পাশাপাশি আপনি কী চান তা উল্লেখ করতে হবে।
string='This is a sample 123 text and some 987 numbers'
echo "$string" | sed -rn 's/[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)[^[:digit:]]*/\1 \2/p'
এটি বলে:
-n
)p
)সাধারণভাবে, আপনি sed
পিছনে রেফারেন্স ব্যবহার করে যা ক্যাপচার করেন তা বন্ধনী এবং আউটপুট ব্যবহার করে দলগুলি ক্যাপচার করে:
echo "foobarbaz" | sed 's/^foo\(.*\)baz$/\1/'
"বার" আউটপুট হবে। আপনি যদি এক্সটেন্ডেড রেজেক্সের জন্য -r
( -E
ওএস এক্সের জন্য) ব্যবহার করেন তবে আপনার প্রথম বন্ধনী থেকে বাঁচার দরকার নেই:
echo "foobarbaz" | sed -r 's/^foo(.*)baz$/\1/'
9 টি পর্যন্ত ক্যাপচার গ্রুপ এবং তাদের পিছনে উল্লেখ থাকতে পারে। গ্রুপগুলি উপস্থিত হওয়ার সাথে সাথে পিছনের রেফারেন্সগুলি গণনা করা হয়েছে তবে সেগুলি কোনও ক্রমে ব্যবহার করা যেতে পারে এবং পুনরাবৃত্তি করা যেতে পারে:
echo "foobarbaz" | sed -r 's/^foo(.*)b(.)z$/\2 \1 \2/'
আউটপুটস "এ বার এ"।
আপনার যদি জিএনইউ থাকে grep
(এটি ওএস এক্স সহ বিএসডি-তেও কাজ করতে পারে):
echo "$string" | grep -Po '\d+'
বা বৈচিত্রগুলি যেমন:
echo "$string" | grep -Po '(?<=\D )(\d+)'
-P
বিকল্প পার্ল সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশন দেয়। দেখুন man 3 pcrepattern
বা man
3 pcresyntax
।
sed
উদাহরণটির উল্লেখ করছেন , আপনি যদি -r
বিকল্পটি (বা -E
ওএস এক্স, আইআইআরসি) ব্যবহার করেন তবে আপনাকে প্রথম বন্ধনী থেকে বাঁচতে হবে না। পার্থক্যটি হল বেসিক নিয়মিত এক্সপ্রেশন এবং বর্ধিত নিয়মিত এক্সপ্রেশন ( -r
) এর মধ্যে।
শেডের নয়টি পর্যন্ত স্মরণযোগ্য নিদর্শন রয়েছে তবে আপনাকে নিয়মিত অভিব্যক্তির অংশগুলি মনে রাখতে পালানো বন্ধনী ব্যবহার করা দরকার।
উদাহরণ এবং আরও বিশদ জন্য এখানে দেখুন
sed -e 's/version=\(.+\)/\1/' input.txt
এটি এখনও পুরো ইনপুটটি আউটপুট দেবে t টেক্সট
\+
পরিবর্তে লিখতে হবে +
। এবং আমি বুঝতে পারি না কেন লোকেরা -e
কেবল একটি সেড কমান্ডের জন্য ব্যবহার করে ।
sed -e -n 's/version=\(.+\)/\1/p' input.txt
দেখুন: mikeplate.com/2012/05/09/…
sed -E
তথাকথিত "আধুনিক" বা "বর্ধিত" নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করার পরামর্শ দিচ্ছি যা পার্ল / জাভা / জাভাস্ক্রিপ্ট / গো / যাই হোক না কেন স্বাদ থেকে অনেক বেশি কাছাকাছি দেখায়। (এর সাথে তুলনা grep -E
বা egrep
।) ডিফল্ট সিনট্যাক্স ঐ অদ্ভুত পলায়নের নিয়ম আছে এবং "অপ্রচলিত" বলা হয়। দুজনের মধ্যে পার্থক্য সম্পর্কে আরও তথ্যের জন্য, চালান man 7 re_format
।
আপনি গ্রেপ ব্যবহার করতে পারেন
grep -Eow "[0-9]+" file
o
বিকল্প নেই - unixhelp.ed.ac.uk/CGI/man-cgi?grep : -o, --only-ম্যাচিং দেখান শুধুমাত্র একটি মানানসই লাইনের অংশ ম্যাচ দৃষ্টান্ত
grep -Eow -e "[0-9]+" -e "[abc]{2,3}"
আমি জানি না আপনি কীভাবে এই দুটি এক্সপ্রেশনটি আগের গ্রীপ থেকে পাইপিংয়ের পাশে এক লাইনে থাকতে পারেন (যা এখনও কোনও কাজ করতে পারে না যদি কোনও প্যাটার্ন এক লাইনের সাথে একাধিকবার মেলে তবে )।
এই উত্তরটি কোনও সংখ্যা গোষ্ঠীর সাথে কাজ করে। উদাহরণ:
$ echo 'Num123that456are7899900contained0018166intext' |
> sed -En 's/[^0-9]*([0-9]{1,})[^0-9]*/\1 /gp'
123 456 7899900 0018166
কেবল আটককৃত গ্রুপগুলিকে আউটপুট দেওয়ার জন্য কি কোনও উপায় আছে?
হ্যাঁ. ক্যাপচার গ্রুপ দ্বারা সমস্ত পাঠ্য প্রতিস্থাপন:
$ echo 'Number 123 inside text' | sed 's/[^0-9]*\([0-9]\{1,\}\)[^0-9]*/\1/'
123
s/[^0-9]* # several non-digits
\([0-9]\{1,\}\) # followed by one or more digits
[^0-9]* # and followed by more non-digits.
/\1/ # gets replaced only by the digits.
বা বর্ধিত বাক্য গঠন (কম ব্যাককোটিস এবং + এর ব্যবহারের অনুমতি দিন) সহ:
$ echo 'Number 123 in text' | sed -E 's/[^0-9]*([0-9]+)[^0-9]*/\1/'
123
সংখ্যা নেই যখন মূল পাঠ্য মুদ্রণ এড়াতে, ব্যবহার করুন:
$ echo 'Number xxx in text' | sed -En 's/[^0-9]*([0-9]+)[^0-9]*/\1/p'
এবং কয়েকটি সংখ্যার সাথে মেলে (এবং সেগুলি মুদ্রণও করতে):
$ echo 'N 123 in 456 text' | sed -En 's/[^0-9]*([0-9]+)[^0-9]*/\1 /gp'
123 456
এটি কোনও সংখ্যা রানের গণনার জন্য কাজ করে:
$ str='Test Num(s) 123 456 7899900 contained as0018166df in text'
$ echo "$str" | sed -En 's/[^0-9]*([0-9]{1,})[^0-9]*/\1 /gp'
123 456 7899900 0018166
যা গ্রেপ কমান্ডের সাথে খুব মিল:
$ str='Test Num(s) 123 456 7899900 contained as0018166df in text'
$ echo "$str" | grep -Po '\d+'
123
456
7899900
0018166
এবং প্যাটার্ন:
/([\d]+)/
শেড '\ d' (শর্টকাট) সিনট্যাক্সটি সনাক্ত করে না। উপরে ব্যবহৃত আসকি সমতুল্য [0-9]
হুবহু সমতুল্য নয়। একটি বিকল্প বিকল্প হ'ল একটি অক্ষর শ্রেণি ব্যবহার করা: '[[: ডিজিট:]] ``
নির্বাচিত উত্তর সমাধান তৈরি করতে যেমন "চরিত্রের ক্লাসগুলি" ব্যবহার করে:
$ str='This is a sample 123 text and some 987 numbers'
$ echo "$str" | sed -rn 's/[^[:digit:]]*([[:digit:]]+)[^[:digit:]]+([[:digit:]]+)[^[:digit:]]*/\1 \2/p'
এই সমাধানটি কেবলমাত্র (দুই) অঙ্কের অঙ্কের জন্য কাজ করে।
অবশ্যই, শেলের ভিতরে উত্তরটি কার্যকর করা হচ্ছে, আমরা এই জাতীয় উত্তরকে আরও সংক্ষিপ্ত করতে কয়েকটি পরিবর্তনশীল সংজ্ঞায়িত করতে পারি:
$ str='This is a sample 123 text and some 987 numbers'
$ d=[[:digit:]] D=[^[:digit:]]
$ echo "$str" | sed -rn "s/$D*($d+)$D+($d+)$D*/\1 \2/p"
তবে, যেমন ইতিমধ্যে ব্যাখ্যা করা হয়েছে, একটি s/…/…/gp
কমান্ড ব্যবহার করা ভাল:
$ str='This is 75577 a sam33ple 123 text and some 987 numbers'
$ d=[[:digit:]] D=[^[:digit:]]
$ echo "$str" | sed -rn "s/$D*($d+)$D*/\1 /gp"
75577 33 123 987
এটি সংখ্যার পুনরাবৃত্তি রান এবং একটি সংক্ষিপ্ত (er) কমান্ড উভয়ই কভার করবে।
আমি বিশ্বাস করি যে প্রশ্নে দেওয়া প্যাটার্নটি কেবল উদাহরণের মাধ্যমে ছিল, এবং লক্ষ্য ছিল কোনও প্যাটার্নের সাথে মেলে ।
আপনি যদি একটি থাকে তাহলে sed প্যাটার্ন মহাকাশে একটি newline এর গনুহ এক্সটেনশন সন্নিবেশ যার ফলে সঙ্গে, এক পরামর্শ হল:
> set string = "This is a sample 123 text and some 987 numbers"
>
> set pattern = "[0-9][0-9]*"
> echo $string | sed "s/$pattern/\n&\n/g" | sed -n "/$pattern/p"
123
987
> set pattern = "[a-z][a-z]*"
> echo $string | sed "s/$pattern/\n&\n/g" | sed -n "/$pattern/p"
his
is
a
sample
text
and
some
numbers
এই উদাহরণগুলি CYGWIN এর সাথে tcsh (হ্যাঁ, আমি এটির ভুল শেলটি জানি ) with (সম্পাদনা করুন: ব্যাশের জন্য, সেটটি এবং আশেপাশের স্থানগুলি সরিয়ে ফেলুন =।)
+
আপনাকে এড়াতে বা -r
বিকল্পটি ( -E
ওএস এক্সের জন্য) ব্যবহার করতে হবে । এছাড়াও আপনি ব্যবহার করতে পারেন \{1,\}
(অথবা -r
বা -E
পলায়নের ছাড়াই)।
ছেড়ে দিন এবং পার্ল ব্যবহার করুন
যেহেতু sed
এটিকে কেটে নয়, এর ঠিক গামছা নিক্ষেপ এবং ব্যবহার পার্ল, অন্তত এটা দিন lsb যখন grep
গনুহ এক্সটেনশন নয় :-)
পুরো ম্যাচিং অংশটি মুদ্রণ করুন, কোনও মেলানো গোষ্ঠী বা লুকের পিছনে প্রয়োজন নেই:
cat <<EOS | perl -lane 'print m/\d+/g'
a1 b2
a34 b56
EOS
আউটপুট:
12
3456
প্রতি লাইনে একক মিল, প্রায়শই কাঠামোগত ডেটা ক্ষেত্র:
cat <<EOS | perl -lape 's/.*?a(\d+).*/$1/g'
a1 b2
a34 b56
EOS
আউটপুট:
1
34
নজরদারি সহ:
cat <<EOS | perl -lane 'print m/(?<=a)(\d+)/'
a1 b2
a34 b56
EOS
একাধিক ক্ষেত্র:
cat <<EOS | perl -lape 's/.*?a(\d+).*?b(\d+).*/$1 $2/g'
a1 c0 b2 c0
a34 c0 b56 c0
EOS
আউটপুট:
1 2
34 56
প্রতি লাইনে একাধিক মিল, প্রায়শই কাঠামোগত ডেটা:
cat <<EOS | perl -lape 's/.*?a(\d+)|.*/$1 /g'
a1 b2
a34 b56 a78 b90
EOS
আউটপুট:
1
34 78
নজরদারি সহ:
cat EOS<< | perl -lane 'print m/(?<=a)(\d+)/g'
a1 b2
a34 b56 a78 b90
EOS
আউটপুট:
1
3478
চেষ্টা
sed -n -e "/[0-9]/s/^[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\).*$/\1 \2 \3 \4 \5 \6 \7 \8 \9/p"
আমি এটি সাইগউইনের অধীনে পেয়েছি:
$ (echo "asdf"; \
echo "1234"; \
echo "asdf1234adsf1234asdf"; \
echo "1m2m3m4m5m6m7m8m9m0m1m2m3m4m5m6m7m8m9") | \
sed -n -e "/[0-9]/s/^[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\)[^0-9]*\([0-9]*\).*$/\1 \2 \3 \4 \5 \6 \7 \8 \9/p"
1234
1234 1234
1 2 3 4 5 6 7 8 9
$
ওপি (গ্রুপগুলি ক্যাপচার) এর জন্য যা চেয়েছিল তা নয় তবে আপনি এটি ব্যবহার করে নম্বরগুলি বের করতে পারেন:
S='This is a sample 123 text and some 987 numbers'
echo "$S" | sed 's/ /\n/g' | sed -r '/([0-9]+)/ !d'
নিম্নলিখিত দেয়:
123
987
sed
সহ বর্ধিত নিয়মিত অভিব্যক্তি চালু করা দরকার-E
।