একটি স্ট্রিংয়ে বিশেষ অক্ষরগুলি কীভাবে পালানো যায়?


16

$fileএকটি ফাইলের নামের মান ধরে নিচ্ছি , বলুন Dr' A.tif। বাশ প্রোগ্রামিংয়ে, আমি কীভাবে একক উদ্ধৃতি এবং বিশেষ চরিত্রটি $fileসরিয়ে না রেখে এর অন্য কোনও বিশেষ চরিত্র থেকে বাঁচতে পারি ?

9 জুলাই 2014-এ আপডেট

@ গিলসের অনুরোধ হিসাবে নিম্নলিখিত কোড স্নিপেট যা পরিচালনা করতে সক্ষম নয় Dr' A.tif:

files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
   newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}

পরে আমি বাইরে চেষ্টা করেছি @Patrick থেকে উত্তর উপর line 1, এটা আমার জন্য কাজ মনে হয়। কিন্তু আমি যদি যেমন ফাইল আছে Dr\^s A.tif, printfকমান্ড সাহায্যের বলে মনে হচ্ছে না, আমার দেখায় Dr\^s\ A.tif। আমি যদি ম্যানুয়ালি এটির মতো কনসোলে চেষ্টা করি:

printf "%q" "Dr\^s A.tif"

আমি এই আউটপুট হবে:

Dr\\\^s\ A.tif

কোন ধারণা কীভাবে এটি পরিচালনা করবেন?


3
আপনি কোন প্রসঙ্গে use ফাইলটি ব্যবহার করবেন বলে আশা করছেন? বা এই সমস্যাটি character ফাইলটিতে বিশেষ চরিত্রের সাথে স্ট্রিং বরাদ্দ করছে?
ছিনিয়ে নিন

আসলে ফাইন্ড কমান্ড আমাকে ফাইল তালিকার একটি অ্যারে ফিরিয়ে দেয়। এবং তারপরে আমি এই ফাইলের তালিকাটি $ ফাইল ভেরিয়েবলের মধ্যে লুপ করব।
huahsin68

2
আপনাকে এখানে কিছু সঠিক উত্তর দেওয়া হয়েছে তবে আপনি সম্ভবত যা জিজ্ঞাসা করছেন তার উত্তর সেগুলি সম্ভবত নয়। আপনার মন্তব্যটি থেকে আমি দৃ strongly়ভাবে সন্দেহ করি যে আপনি ভুল পথে আছেন। আমরা আপনাকে বেশি সাহায্য করতে পারি না কারণ আপনি নিজের কোডটি প্রদর্শন করছেন না। তবে আমি আপনাকে প্রস্তাব দিচ্ছি যে আপনি পড়ুন কেন আমার শেল স্ক্রিপ্টটি সাদা স্থান বা অন্যান্য বিশেষ চরিত্রগুলিতে চট করে? পটভূমি হিসাবে আপনার স্ক্রিপ্টটি দেখান এবং আপনি কী করতে চান তা ব্যাখ্যা করুন।
গিলস 21'8

উত্তর:


14

এটি সম্পন্ন করতে আপনি printfবিল্টিনটি ব্যবহার করতে পারেন %q। উদাহরণ স্বরূপ:

$ file="Dr' A.tif"
$ printf '%q\n' "$file"
Dr\'\ A.tif

$ file=' foo$bar\baz`'
$ printf '%q\n' "$file"
\ foo\$bar\\baz\`

এতে বাশ ডকুমেন্টেশন থেকে printf:

In addition to the standard format specifications described in printf(1)
and printf(3), printf interprets:

 %b       expand backslash escape sequences in the corresponding argument
 %q       quote the argument in a way that can be reused as shell input
 %(fmt)T  output the date-time string resulting from using FMT as a format
          string for strftime(3)

আপনার যখন ডাবল-কোট সংরক্ষণের দরকার হয় তখন এটি কিছু নির্দিষ্ট কেসগুলির সাথে কাজ করে না।
ব্যবহারকারী 3467349

@ ব্যবহারকারী 3467349 এটি উদ্ধৃতি সহ ঠিক কাজ করে। আমি বাজি ধরছি আপনি এরকম কিছু চেষ্টা করছেন printf '%s' "foo"। আপনাকে প্রথমে শেলটিতে আর্গুমেন্ট পার্সিং কীভাবে কাজ করে তা বুঝতে হবে। Gnu.org/software/bash/manual/bash.html# শেল- অপারেশন # 2 দেখুন # 6 এর আগে ঘটে।
প্যাট্রিক

আপনি কি printfঅন্য কোনও ম্যানিপুলেশন সহ মুদ্রিত এই স্ট্রিংয়ের উদাহরণ সরবরাহ করতে পারেনIt doesn't have a: ""
ব্যবহারকার 3467349

আপনার ইস্যুটির কোনও সম্পর্ক নেই printf। আপনার সমস্যাটি হ'ল আপনি শেলটি আপনার স্ট্রিংকে বিশ্লেষণ করতে চান না। এটি করার জন্য, আপনাকে নিজের ইনপুটটি এমনভাবে পাস করতে হবে যেখানে এটি পার্স করার চেষ্টাও করে না। এটি করার একটি উপায় read -r -p 'input: ' && printf '%q\n' "$REPLY"হ'ল, এবং অনুরোধ জানানো হলে ইনপুট সরবরাহ করুন।
প্যাট্রিক

1
আমি এখন বেশ কয়েকবার বলেছি। কীভাবে শেলটিতে কাঁচা ডেটা পাঠানো যায় তা না জানা কোনও সমস্যা নয় printf। আপনার সমস্যার সাথে কোনও সম্পর্ক নেই এমন কোনও সমাধানের সমালোচনা করার পরিবর্তে আপনার একটি প্রশ্ন জিজ্ঞাসা করা উচিত।
প্যাট্রিক

4

চেষ্টা করুন: -

file=Dr\'\ A.tif
echo $file
Dr' A.tif

অথবা

file="Dr' A.tif"
echo $file
Dr' A.tif

অথবা যদি স্ট্রিংটিতে একটি ডাবল উক্তি থাকে: -

file='Dr" A.tif'
echo $file
Dr" A.tif

নেট থেকে উদ্ধার এবং উদ্ধৃতি সম্পর্কে ভাল টিউটোরিয়াল রয়েছে। এই এক দিয়ে শুরু করুন ।


1

কোনও স্ক্রিপ্টে আপনি যে ফাইল ফাইল পরিচালনা করছেন তা এড়াতে হবে না। যদি আপনি কোনও স্ক্রিপ্টে কোনও ফাইলের নামকে আক্ষরিক হিসাবে রাখতে চান , বা একক ইনপুট স্ট্রিম হিসাবে একাধিক ফাইলের নাম অন্য স্ক্রিপ্টে পাস করতে চান তবেই এস্কেপিং প্রয়োজনীয় ।

আপনি আউটপুট মাধ্যমে looping করছি যেহেতু find, এই (!) সবচেয়ে সহজ উপায়ে হয় প্রতি সম্ভব পাথ হ্যান্ডেল :

while IFS= read -r -d ''
do
    file_namex="$(basename -- "$REPLY"; echo x)"
    file_name="${file_namex%$'\nx'}"
    do_something -- "$file_name"
done <(find "$some_path" -exec printf '%s\0' {} +)


-1

শীর্ষে-ভোট দেওয়া একটি সহ এই উত্তরগুলি অনেকগুলি printf "%q"অতিরিক্ত হেরফের ছাড়াই সব ক্ষেত্রে কার্যকর হবে না। আমি নীচের পরামর্শ দেবো (নীচে উদাহরণ):

cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: "" EOF


N00b প্রশ্নটি ক্ষমা করুন তবে আপনি কীভাবে স্ট্রিংয়ের অক্ষরগুলি থেকে বাঁচতে এটি ব্যবহার করবেন তা বিশদভাবে বলতে পারেন? আমার টার্মিনালে আপনি যে কোডটি লিখেছেন তা আমি অনুলিপি করলে এটি কেবল 2015-11-07T03: 34: 41Z অ্যাপ্লিকেশন [পোস্টগ্রেস.0000]: [TAG] পাঠ্য-অনুসন্ধানের প্রশ্নের সাথে লেক্সিম নেই: "" ... কিছুই এড়ানো যায় না ।
শার্ক অলি

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