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


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.