প্রতিটি পরামিতি থেকে একটি পিছনে স্ল্যাশ সরানোর সহজ উপায় কী?


98

'$ @' অ্যারেতে প্রতিটি প্যারামিটার থেকে একটি পেছনের স্ল্যাশ সরানোর সহজ উপায় কী, যাতে rsyncনামগুলি ডিরেক্টরিতে অনুলিপি করে?

rsync -a --exclude='*~' "$@" "$dir"

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


উত্তর:


160

আপনি এখানে${parameter%word} বিস্তৃত বিস্তৃতিটি ব্যবহার করতে পারেন । এখানে একটি সাধারণ পরীক্ষা স্ক্রিপ্ট যা আচরণটি দেখায়:

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}

35
+1: অত্যধিক পেডেন্টিক হওয়ার জন্য, এটি একটি একক স্ল্যাশ সরিয়ে ফেলবে, সমস্ত অনুসরণীয় স্ল্যাশ নয়। যেকোন সংখ্যক shopt -s extglob; echo "${@%%+(/)}"
— ট্রেলিং স্ল্যাশগুলি

24
সতর্কতা: আপনি সমস্ত ক্ষেত্রে ট্রেলিং স্ল্যাশগুলি সরাতে চাইবেন না। "/" যদি একটি আর্গুমেন্ট হিসাবে সরবরাহ করা হয় তবে পিছনের স্ল্যাশ সরিয়ে ফেললে ... দুর্ভাগ্যজনক পরিণতি হবে।
— গর্ডন ডেভিসন

13
পরামর্শ: tr -s /পুনরাবৃত্ত স্ল্যাশগুলি সরিয়ে ফেলার জন্য চলক রেজেক্সের সাথে একত্রিত হন তারপরে ট্রেলিং স্ল্যাশ সরান। যেমনDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
— ডেভ

4
সত্যি? বাশ প্রম্পটে, দৌড়ে যান set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"এবং আমাকে যা দেখছেন তা বলুন
— গ্লেন জ্যাকম্যান

4
@ ট্যুটবার্গ আমি "প্রোটিক্স" এর প্রশংসা করি যা মন্তব্য থ্রেডে ওপির প্রশ্নের বিকল্প বিকল্প নয়।
— কাইল স্ট্র্যান্ড

39

গৃহীত উত্তরটি একটি ট্রেলিং স্ল্যাশ ছাঁটাই করবে।

একাধিক ট্রেলিং স্ল্যাশ ছাঁটাই করার একটি উপায় এরকম:

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

কোন ফলাফল:

/looks/like/a/path/// /looks/like/a/path

4
আপনার ভেরিয়েবলগুলি উদ্ধৃত করতে ভুলবেন না, যদি সেগুলিতে সাদা স্থান থাকে: TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
— তেটসুজিন

4
আসলে এটি $()নির্মাণের অভ্যন্তরে প্রয়োজনীয় নয় । তবে এটি নিরীহও :) তাই সম্ভবত ডাবল কোট ব্যবহার করা ভাল অভ্যাস যা "$VALUE"আপনাকে কখন কখন ডাবল কোট ব্যবহার করবেন না তা সিদ্ধান্ত নেওয়ার দরকার নেই।
— ক্রিস জনসন

এটি আগে ক্যাপচারের সাথে একত্রিত করার কোনও উপায়? আমি প্রোটোকলটি স্ট্রিপ করতে চাই এবং (উপস্থিত থাকলে) ইউআরএল থেকে ট্র্যাশিং স্ল্যাশ echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'করে কিন্তু কাজ করে না (যেহেতু ক্যাপচার গ্রুপটি ট্রেলিং স্ল্যাশের সাথে মেলে তেমনি আমারও ধারণা)। আমি এটি দুটি কমান্ড দিয়ে করতে পারি: echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'তবে ভাবছি এটি যদি একটি দিয়ে করা যায়?
— আদম

এই উত্তরটি আমার জন্য খুব বড় ইনপুট ফাইলের সাথে আরও ভালভাবে কাজ করেছে। একটি সরল sed 's:/*$::' < in.txt > out.txtসেকেন্ডের মধ্যে পেশা আছে
— MitchellK

22

এটি আমার পক্ষে কাজ করে: ${VAR%%+(/)}

যেমনটি এখানে বর্ণনা করা হয়েছে http://wiki.bash-hackers.org/syntax/ Pattern

শেল অপশন এক্সগ্লোব সেট করতে হবে। আমি এটি আমার জন্য সক্ষম দেখতে পাচ্ছি না তবে এটি এখনও কার্যকর হয়


4
shopt extglobকোনও বিকল্প নেই
— গ্লেন জ্যাকম্যান

এই প্যাটার্ন সম্প্রসারিত হয় ভাষা ও আপনি আবশ্যক সেট extglob।
— in 21 ই

4
এটি ম্যাক ওএস এক্স এর বিল্টিন ব্যাশে কাজ করে না। উপরের শান ব্রাইটের সমাধানটি করে:${VAR%/}
— অ্যালেক জ্যাকবসন

13

realpathপ্রদত্ত পথটি সমাধান করে। অন্যান্য জিনিসগুলির মধ্যে এটি পিছনে স্ল্যাশগুলিও সরিয়ে দেয়। -sনীচের সিমলিঙ্কগুলি রোধ করতে ব্যবহার করুন

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a

4
এটির জন্য শেষেরটি ব্যতীত পথের সমস্ত নোডের প্রয়োজন। যদি ব্যবহারকারী কিছু অ-অস্তিত্ব পথে ফেলে দেয় তবে realpathব্যর্থ হবে।
— লিভি

4
@ লিভি realpath --canonicalize-missingকোনও অস্তিত্বহীন অংশের সাথে পুরোপুরি সঠিকভাবে কাজ করে
— মাওয়েজম

এবং রিয়েলপথটি কয়েকটি প্ল্যাটফর্মে অনুপস্থিত :-(
— মার্ক রিবাউ

8

এফওয়াইআই, আমি .bash_profileএসও-তে পাওয়া উত্তরের ভিত্তিতে এই দুটি ফাংশন যুক্ত করেছি । ক্রিস জনসন যেমন বলেছিলেন, সমস্ত উত্তর ${x%/}কেবল একটি স্ল্যাশ অপসারণ করে , এই ফাংশনগুলি তারা যা বলে তা করবে, আশা করি এটি কার্যকর।

rem_trailing_slash() {
    echo "$1" | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo "$(rem_trailing_slash "$1")/"
}

4

ইন zsh আপনি ব্যবহার করতে পারেন :aপরিবর্তক।

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

এটি realpathআর্গুমেন্ট হিসাবে হারিয়ে যাওয়া ফাইল / ডিরেক্টরিগুলির সাথে ব্যর্থ হয় না তবে কাজ করে।

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