মনে করুন, jq JSON-এর মতো একই ডেটা টাইপ সাপোর্ট করে।
JSON স্ট্রিং-কে এভাবে বর্ণনা করে:
একটি স্ট্রিং হলো শূন্য বা ততোধিক ইউনিকোড ক্যারেক্টারের একটি ক্রম, যা ডাবল কোটের ভেতরে মোড়ানো থাকে এবং ব্যাকস্ল্যাশ এস্কেপ ব্যবহার করে লেখা হয়।
একটি স্ট্রিংয়ের ভেতরে "বিশেষ" ক্যারেক্টার ঢোকাতে ব্যাকস্ল্যাশ ক্যারেক্টার ব্যবহার করুন:
\" একটি আক্ষরিক উদ্ধৃতি চিহ্ন,\\ একটি আক্ষরিক ব্যাকস্ল্যাশ,\n, \t, \r, \f, \b
\uAAAA, যেখানে A একটি হেক্স ডিজিটক্যারেক্টারের সংখ্যা বের করতে length ফাংশনটি ব্যবহার করুন।
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
সাবস্ট্রিং বের করতে স্লাইস নোটেশন ব্যবহার করা যায়।
সিনট্যাক্স হলো .[i:j]।
রিটার্ন করা সাবস্ট্রিংয়ের দৈর্ঘ্য j - i, যা ইনডেক্স i (অন্তর্ভুক্ত) থেকে ইনডেক্স j (অন্তর্ভুক্ত নয়) পর্যন্ত ক্যারেক্টার রিটার্ন করে।
যেকোনো ইনডেক্স ঋণাত্মক হতে পারে, সেক্ষেত্রে এটি স্ট্রিংয়ের শেষ থেকে পিছনের দিকে গোনে।
যেকোনো ইনডেক্স বাদ দেওয়া যেতে পারে, সেক্ষেত্রে এটি স্ট্রিংয়ের শুরু বা শেষ বোঝায়।
ইনডেক্স শূন্য থেকে শুরু হয়।
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
স্ট্রিং জোড়া লাগাতে + ব্যবহার করুন:
"Hello" + " " + "world!"
# => "Hello world!"
স্ট্রিংয়ের একটি অ্যারে দেওয়া হলে add ব্যবহার করুন:
["Hello", " ", "world!"] | add
# => "Hello world!"
স্প্লিট করতে split/1 ফাংশনটি বা / অপারেটরটি ব্যবহার করা হয়:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
split/1-এর বিপরীত হলো join/1।
একটি স্ট্রিংকে ক্যারেক্টারের অ্যারে-তে রূপান্তর করা অনেক সময় প্রয়োজন হয়। এটি করার দুটি উপায় আছে:
খালি স্ট্রিং-এ স্প্লিট করুন
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode করে কোডপয়েন্ট-এর একটি অ্যারে বানান
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode হলো explode-এর বিপরীত।
index/1 ফাংশনটি ব্যবহার করুন; ইনডেক্স শূন্য থেকে শুরু হয়।
"hello" | index("el")' # => 1
সাবস্ট্রিংটি যদি স্ট্রিংয়ে না থাকে, তাহলে ফলাফল null
"hello" | index("elk") # => null
একটি স্ট্রিংয়ের ভেতরে \(expression) সিকোয়েন্সটি ওই এক্সপ্রেশনের ফলাফল স্ট্রিংয়ের ভেতরে ঢুকিয়ে দেবে:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
ascii_downcase ও ascii_upcase ফাংশন দুটি ব্যবহার করুন।
jq-তে রেগুলার এক্সপ্রেশনের জন্য সমৃদ্ধ সাপোর্ট আছে: এটি পরের একটি পাঠের বিষয় হবে।
এই অনুশীলনীতে আপনি লগ এন্ট্রি প্রসেস করবেন।
প্রতিটি লগ লাইন হলো একটি স্ট্রিং, যার ফরম্যাট নিচের মতো: "[<LEVEL>]: <MESSAGE>"।
এখানে তিনটি ভিন্ন লগ লেভেল আছে:
INFOWARNINGERRORআপনার সামনে তিনটি কাজ আছে, প্রতিটিতে একটি লগ লাইন নিয়ে সেটি দিয়ে কিছু করতে বলা হবে। এই কাজগুলো সমাধান করার অনেক উপায় আছে। উপরের উদাহরণগুলো থেকে আপনার পছন্দের কৌশল বেছে নিন এবং দেখুন আপনি কী বের করতে পারেন।
লগ লাইনের মেসেজ রিটার্ন করার জন্য message ফাংশনটি ইমপ্লিমেন্ট করুন:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
শুরুতে বা শেষে থাকা যেকোনো হোয়াইট স্পেস সরিয়ে ফেলা উচিত:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
লগ লাইনের লগ লেভেল রিটার্ন করার জন্য log_level ফাংশনটি ইমপ্লিমেন্ট করুন, যা ছোট হাতের অক্ষরে রিটার্ন করা উচিত:
"[ERROR]: Invalid operation" | log_level
# => "error"
reformat ফাংশনটি ইমপ্লিমেন্ট করুন, যা লগ লাইনটি নতুন করে ফরম্যাট করে, মেসেজটি আগে বসায় আর তার পরে বন্ধনীর মধ্যে লগ লেভেল বসায়:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Exercism-এ সাইন আপ করুন, jq ট্র্যাকের 12টি কনসেপ্ট75টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।