বাশ - ক্রমাগত স্ট্রিং ম্যানিপুলেশন


11
#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"

এই দুটি লাইন একসাথে ওয়ান-লাইনারে আঠালো করে তোলা যায় কি?

উত্তর:


12

FILE=$(basename "${1/%.jpeg/.jpg}") আমার জন্য কাজ।

পরীক্ষা:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg

স্ক্রিপ্ট সামগ্রী:

bash-$ cat test.sh 
#!/usr/bin/bash

FILE=$(basename "${1/%.jpeg/.jpg}")

echo "$FILE"

যেহেতু দুটি লাইন কান্ডা ইন্টারচেঞ্জযোগ্য, তাই এই সমাধানটি এখন পর্যন্ত সবচেয়ে নিকটতম ... লাইনগুলি যদি আদান-প্রদানযোগ্য না হয় sedতবে অবশ্যই আমার ধারণা ess
gsklee

11

আপনি বাশে বাসা বাঁধতে পারবেন না (zsh ছাড়া ksh, ছাই এবং অন্যান্য শেলগুলিতেও নয়) est এটি কেবল একটি প্রসাধনী সীমাবদ্ধতা, যেহেতু আপনি বর্ণনা করেছেন আপনি একটি অস্থায়ী ভেরিয়েবলের মধ্যে একটি মধ্যবর্তী ভাবটি নির্ধারণ করতে পারেন। এটি ওয়ান-লাইনারদের জন্য কিছুটা বিরক্তিকর, তবে স্ক্রিপ্টগুলিতে এটি পাঠযোগ্যতার জন্য তর্কযোগ্যভাবে ভাল।

আপনি বাহ্যিক ইউটিলিটি ব্যবহার এড়াতে basenameএবং তার পরিবর্তে স্ট্রিং ম্যানিপুলেশন কনস্ট্রাক্ট ব্যবহার করতে পারেন:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"

এখানে, এটি ঘটে যে আপনি বাইরের কমান্ড প্রতিস্থাপনের জন্য আপনার স্ক্রিপ্টটি পুনরায় লিখতে পারেন । এটি কোনও সাধারণ ঘটনা নয়, আপনি নির্দিষ্ট ওয়ান-লাইনের অনুভূতি বাদে অন্য কিছু অর্জন করতে পারেন না।

Zsh, আরও ভাল বা আরও খারাপের জন্য, আপনাকে বাসা বাড়াতে দেয়:

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting

অথবা আপনি এর পরিবর্তে zsh এর অন্তর্নির্মিত নির্মাণ ব্যবহার করতে পারেন basename:

FILE=${${1:t}/%.jpeg/.jpg}

4

আমি যেতে চাই:

FILE=$(basename $1 .jpeg).jpg

বেসনামে দ্বিতীয় প্যারামিটারটি ফাইলের নাম থেকে সরানোর প্রত্যয় (দেখুন man basename)


3

আপনি sedনিম্নলিখিত হিসাবে একটি একক কমান্ড ব্যবহার করতে পারেন :

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")

2

অন্তর্ভুক্ত sed, এটি কৌশলটি করা উচিত:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(এটি আপনার প্রশ্নের সঠিক উত্তর দেয় না কারণ আমি পারছি না; এটি সম্ভব কিনা তা নিশ্চিত নয়))


1

বাশগুলি ভেরিয়েবলের নাম${} নিয়ে কাজ করে , সুতরাং কোনও কমান্ড সরাসরি এম্বেড করার কোনও উপায় নেই। আপনি অতিরিক্ত কাঁটাচামড়া বিবেচনা না করলে @ sr_ এর পদ্ধতির বিকল্প।


1

লাইন

FILE=$(basename "${1/%.jpeg/.jpg}")

সংক্ষিপ্ত এবং আরও বহনযোগ্য সঙ্গে তৈরি করা যেতে পারে

FILE=$(basename "${1%.jpeg}.jpg")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.