শেল স্ক্রিপ্ট - ভেরিয়েবল থেকে প্রথম এবং শেষ উদ্ধৃতি (") সরান


225

নীচে একটি বৃহত স্ক্রিপ্ট থেকে একটি শেল স্ক্রিপ্ট স্নিপেট আছে। এটি স্ট্রিং থেকে উদ্ধৃতিগুলি সরিয়ে দেয় যা একটি ভেরিয়েবল দ্বারা রাখা হয়। আমি সেড ব্যবহার করে এটি করছি, তবে এটি দক্ষ? যদি তা না হয় তবে দক্ষ উপায় কী?

#!/bin/sh

opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp

আমি ব্যবহার করার পরামর্শ দিতে হবে sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"। এই বাক্য গঠনটি কেবল তখনই কোয়েটগুলি সরিয়ে ফেলবে যখন কোনও মিলের জুড়ি থাকবে।
জন স্মিথ

@ জনস্মিত আমাকেও শেল স্ক্রিপ্টে স্বয়ংক্রিয়ভাবে উদ্ধৃতিগুলি এড়াতে হবে, তবে সেগুলি মিলছে কি না আমার তা করা দরকার, সুতরাং আপনার পোস্ট করা অভিব্যক্তি আমি সম্ভবত ব্যবহার করব না।
11:44

আপনি যদি সমস্ত উদ্ধৃতি সরিয়ে দিতে চাইলে এই প্রশ্নটি খুঁজে পেয়েছেন তবে এই উত্তরটি দেখুন: Askubuntu.com/a/979964/103498
গর্ডন বিন

উত্তর:


268

নেটিভ শেল উপসর্গ / প্রত্যয় অপসারণ বৈশিষ্ট্যটি ব্যবহার করে একটি সহজ এবং আরও কার্যকর উপায় রয়েছে:

temp="${opt%\"}"
temp="${temp#\"}"
echo "$temp"

${opt%\"} প্রত্যয়টি মুছে ফেলবে " (শেল ব্যাখ্যাটি আটকাতে ব্যাকস্ল্যাশ নিয়ে পালানো)।

${temp#\"}উপসর্গটি মুছে ফেলবে "(শেল এর ব্যাখ্যা আটকাতে ব্যাকস্ল্যাশ নিয়ে পালানো)।

আরেকটি সুবিধা হ'ল এটি যদি আশেপাশের উদ্ধৃতিগুলি থাকে তবে কেবল আশেপাশের উদ্ধৃতিগুলি সরিয়ে ফেলবে।

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

সেড ব্যবহার:

echo "$opt" | sed -e 's/^"//' -e 's/"$//'

(উন্নত সংস্করণ, jfgagne দ্বারা নির্দেশিত হিসাবে, প্রতিধ্বনির হাত থেকে মুক্তি)

sed -e 's/^"//' -e 's/"$//' <<<"$opt"

সুতরাং এটি কোনও নেতৃত্বের "সাথে কোনও "কিছুই ছাড়াই স্থান দেয় এবং কিছুই দিয়ে কিছুই অনুসরণ করে না। একই অনুরোধে (পাইপ দিয়ে অন্য সিড শুরু করার দরকার নেই Using ব্যবহার করে -eআপনার একাধিক পাঠ্য প্রক্রিয়াজাতকরণ থাকতে পারে)।


14
আপনি এর সাথে সেড দ্রবণে পাইপ থেকে মুক্তি পেতে পারেন sed -e 's/^"//' -e 's/"$//' <<< $opt
jfg956

1
এটি এটিকে দুর্ব্যবহার করতে পারে স্ট্রিংটিতে শীর্ষস্থানীয় এবং পিছনের কোট অক্ষর উভয়ই নেই। নিখুঁতভাবে পরিচালনা করার জন্য কোনও পরামর্শ?
jsears

কেবল মিলিত বাইরের উক্তিগুলি হ্যান্ডেল করতে, @ জোয়াচিম পাইলবার্গ
জেসার্স

1
@ জেসার্স হাহ? এটি বিশেষত যদি একটি থাকে তবে শুরু থেকে একটিটিকে ট্রিম করে এবং প্রান্তটি থেকে একটি থাকে। যদি উভয় উপস্থিত না হয় আপনি সরাতে না চান; হ্যাঁ, একটি একক sedরেজেক্স ব্যবহার করা যেতে পারে, বা ভেরিয়েবল প্রতিস্থাপন কোনও লাইনে আবদ্ধ করা যেতে পারেcase $opt in '"'*'"') ... do it ... ;; esac
ট্রিপল

2
আপনি একাধিক অভিব্যক্তি এড়াতে পারবেনsed 's/^"\|"$//g'
tzrlk

287

মুছতে টিআর ব্যবহার করুন ":

 echo "$opt" | tr -d '"'

দ্রষ্টব্য : এটি কেবল শীর্ষস্থানীয় এবং অনুসরণযোগ্য নয়, সমস্ত ডাবল উদ্ধৃতি সরিয়ে দেয়।


16
এটি কেবল নেতৃস্থানীয় এবং অনুসরণীয় বিষয়গুলি নয়, সমস্ত কোট সরিয়ে দেয় বলে ওপি যা চেয়েছিল তা নয়।
লেনার হোয়েট

19
যদিও ওপিকে স্পষ্টভাবে উত্তর না দেওয়া আমার পক্ষে এটি সমাধান করে কারণ "/ পাথ / ফাইল-নাম" এর শুরু এবং শেষে কেবলমাত্র ডাবল উদ্ধৃতি রয়েছে। কোনও এমবেডড ডাবল উদ্ধৃতি নেই। +1
WinEunuuchs2Unix

6
এই সমাধানটি অনেক লোক যা চায় তা হবে। অনেক ক্ষেত্রে, স্ক্রিপ্টিং সহজেই কোট দ্বারা ঘেরা একটি স্ট্রিংয়ের থেকে কার্যক্ষম ডেটা পেতে পারে।
শাদোনিনজা

2
মার্জিত এবং আমাকে আরও অনেক পরীক্ষামূলক-ত্রুটি-ডিবাগ সময় থেকে বাঁচিয়েছে। ধন্যবাদ.
স্কট ওয়েড

এটি আদর্শভাবেই এটি চায় এবং এটি গ্রহণযোগ্য উত্তরের চেয়ে বেশি ভোট কেন দেয় তা জানায়।
অপুরভিসি

38

এটি সমস্ত ডাবল উদ্ধৃতি সরিয়ে ফেলবে।

echo "${opt//\"}"

1
তবে পালানো উদ্ধৃতি যেমন ভাঙবে Don't remove this \" quote:-(
gniourf_gniourf

এটি বাশ এক্সটেনশন, সুতরাং শেল স্ক্রিপ্টের জন্য সাধারণভাবে প্রযোজ্য নয়। (প্রশ্ন যেমন কিনা এই গুরুত্বপূর্ণ বা না দ্ব্যর্থক দর্শকরা যারা Google এ এই এটি একটি POSIX সমাধান খুঁজছেন হতে পারে।।)
tripleee

পরিপূর্ণতা! ঠিক আমার যা প্রয়োজন ছিল। আমি এই জাতীয় প্রশ্নগুলি পছন্দ করি যা আপনাকে উত্তরগুলির আধিক্য দেয়, ওপি যা অনুরোধ করেছিল তা নয়। রত্নগুলি অগ্রহণযোগ্য উত্তরে রয়েছে!
dlite922

আমি ভয় করি ওপি এমন কিছু চায় যা কেবলমাত্র শীর্ষস্থানীয় / অনুসরণযোগ্য উদ্ধৃতিগুলি সরিয়ে দেয় এবং পালিয়ে যাওয়াগুলিকে রাখে।
ফার্নান্দো পাজ

36

এক্সার্গস ব্যবহার করার জন্য একটি সহজ উপায় রয়েছে :

> echo '"quoted"' | xargs
quoted

xargs ডিফল্ট কমান্ড হিসাবে ইকো ব্যবহার করে যদি কোনও কমান্ড সরবরাহ করা হয় না এবং ইনপুট থেকে উদ্ধৃতি সরিয়ে দেয়। যেমন এখানে দেখুন ।


echo '"quoted"' | xargs -> quoted
কায়ব

1
এটি কাজ করে, তবে কেবল একটি স্ট্রিংয়ের সমান সংখ্যক উক্তিগুলির জন্য। যদি কোনও বিজোড় সংখ্যা থাকে তবে এটি ত্রুটি উত্পন্ন করে।
জেমস শেউই


19

কাছাকাছি সবচেয়ে ছোট উপায় - চেষ্টা করুন:

echo $opt | sed "s/\"//g"

এটি আসলে সমস্ত "গুলি (ডাবল কোটস) থেকে সরিয়ে দেয় ( optশুরুতে ও শেষের চেয়ে সত্যই কি আর কোনও ডাবল উদ্ধৃতি হবে? তাই এটি আসলে একই জিনিস, এবং আরও সংক্ষিপ্ত ;-))


4
আপনি যদি সমস্ত ডাবল উদ্ধৃতি মুছে ফেলতে চান, তবে এটি আরও ভাল ব্যবহার করা উচিত: "$ {opt // \" /} "pipe তাদের সর্বদা উদ্ধৃতি ভেরিয়েবলগুলি যেমন: প্রতিধ্বনি "$ অপ্ট"
হুয়েলবাইস

ভাল, ভেরিয়েবলটি মূলত httpd এর কনফিগারেশন ফাইল থেকে ডকুমেন্টআরটের পথটি পড়ে, তাই আমি মনে করি না যে স্ট্রিং-এ কোনও উদ্ধৃতি চরিত্রের সম্ভবত সেখানে থাকতে পারে case এবং এই সেড অনেক নিচু এবং দক্ষ .... ধন্যবাদ!
ব্যবহারকারী 1263746

16

আপনি যদি জিকিউ ব্যবহার করছেন এবং ফলাফলটি থেকে উদ্ধৃতিগুলি সরিয়ে দেওয়ার চেষ্টা করছেন, অন্য উত্তরগুলি কাজ করবে, তবে এর থেকে আরও ভাল উপায় আছে। -rবিকল্পটি ব্যবহার করে , আপনি কোনও উদ্ধৃতি না দিয়ে ফলাফল আউটপুট করতে পারেন।

$ echo '{"foo": "bar"}' | jq '.foo'
"bar"

$ echo '{"foo": "bar"}' | jq -r '.foo'
bar

আমি ব্যবহার করছি jqতবে দয়া করে নোট করুন যে জেকিও যদি এএসসিআইআই আউটপুট আউটপুট করে তবে এটি কাজ করে না -a(এটি জেকিউয়ের পাশের একটি বাগ)
পোয়েরাজোলু

yqএছাড়াও -rবিকল্প আছে:yq -r '.foo' file.yml
হালিব বাবি

12

হালনাগাদ

কেবল বাশ / স্ট্যান্ডার্ড লিনাক্স কমান্ড ব্যবহার করে স্ট্রিংয়ের একক এবং ডাবল উদ্ধৃতিগুলি থেকে সহজ এবং মার্জিত উত্তর :

BAR=$(eval echo $BAR) রেখাচিত্রমালা থেকে উদ্ধৃতি BAR

================================================== ===========

হুয়েবাইসের উত্তরের ভিত্তিতে, আমি অনেক পরীক্ষা এবং ত্রুটির পরে এই ফাংশনটি নিয়ে এসেছি:

function stripStartAndEndQuotes {
    cmd="temp=\${$1%\\\"}"
    eval echo $cmd
    temp="${temp#\"}"
    eval echo "$1=$temp"
}

আপনি যদি মুদ্রিত কিছু চান না, আপনি এভালগুলি পাইপ করতে পারেন /dev/null 2>&1

ব্যবহার:

$ BAR="FOO BAR"
$ echo BAR
"FOO BAR"
$ stripStartAndEndQuotes "BAR"
$ echo BAR
FOO BAR

1
যদিও আমি সত্যিই সহজ এবং মার্জিত পছন্দ করি, আমি মনে করি এটি বিবেচনা করার মতো যে ইওল কেবল ডাবল উদ্ধৃতি ছাঁটাই করে না, তবে কোডের একটি লাইন হিসাবে মূল্যায়ন করে। সুতরাং এই কৌশলটি অপ্রত্যাশিত ফলাফল আনতে পারে যখন বারে শেল দ্বারা প্রতিস্থাপন করতে পারে এমন অন্যান্য ক্রম থাকে (যেমন: BAR = \ 'abc \' বা BAR = ab \ 'c বা BAR = a $ $ b, বা BAR = a \ $ (ls) *))
ম্যাক্সপ

11

বাশের সবচেয়ে সহজ সমাধান:

$ s='"abc"'
$ echo $s
"abc"
$ echo "${s:1:-1}"
abc

একে সাবস্ট্রিং এক্সপেনশন বলা হয় ( জ্ঞানু বাশ ম্যানুয়াল দেখুন এবং অনুসন্ধান করুন ${parameter:offset:length})। এই উদাহরণে এটি sপজিশন 1 থেকে শুরু করে দ্বিতীয় শেষ অবস্থানে শেষ হওয়া থেকে স্ট্রিংগুলি গ্রহণ করে । বাস্তবে দেখা যায় যে যদি কারণে lengthএকটি নেতিবাচক মান হিসাবে এটি একটি পিছন শেষ প্রান্ত থেকে অফসেট চলমান ব্যাখ্যা করা হয় parameter


নেতিবাচক দৈর্ঘ্য বাশ v4.2 থেকে সমর্থিত
mr.spuratic

8

এটি সেড ব্যবহার না করেই সবচেয়ে জটিল উপায়:

x='"fish"'
printf "   quotes: %s\nno quotes:  %s\n" "$x" "${x//\"/}"

অথবা

echo $x
echo ${x//\"/}

আউটপুট:

   quotes: "fish"
no quotes:  fish

আমি এটি একটি উত্স থেকে পেয়েছি ।


এটি স্ট্রিংয়ের সাথে পাশাপাশি এর আশেপাশেরদের থেকে উদ্ধৃতিগুলি সরিয়ে ফেলবে।
jsears


3

এটি করার আরও একটি উপায় আছে। ভালো লেগেছে:

echo ${opt:1:-1}

2

আমার সংস্করণ

strip_quotes() {
    while [[ $# -gt 0 ]]; do
        local value=${!1}
        local len=${#value}
        [[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
        shift
    done
}

ফাংশনটি পরিবর্তিত নাম (গুলি) এবং স্থানে স্ট্রিপস কোট গ্রহণ করে। এটি কেবলমাত্র শীর্ষস্থানীয় এবং অনুগামী উদ্ধৃতিগুলির সাথে একটি মিলে যাওয়া জুটি ফেলা করে। এটি অনুসরণ করে না যে পিছনের উদ্ধৃতিটি এড়িয়ে গেছে (এর আগে রয়েছে)\ যার নিজেও পালানো যায় না)।

আমার অভিজ্ঞতায়, স্ট্রিংগুলি সরাসরি পরিচালনা করার ক্ষেত্রে, কোনও প্যাটার্ন মিলছে না এবং বিশেষত কোনও সাব-শেল তৈরি না করা, বা কোনও বাহ্যিক সরঞ্জাম যেমন কল করার মতো নয়, যেমন সাধারণ-উদ্দেশ্যে স্ট্রিং ইউটিলিটি ফাংশনগুলি (এগুলির একটি গ্রন্থাগার রয়েছে) সর্বাধিক দক্ষ are sed, awkবা grep

var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
    echo $i="${!i}"
done

0

আমি জানি এটি একটি খুব পুরানো প্রশ্ন, তবে এখানে আরও একটি সেড প্রকরণ রয়েছে, যা কারও পক্ষে কার্যকর হতে পারে। অন্য কারও মত নয়, এটি কেবল শুরু বা শেষে ডাবল উদ্ধৃতিগুলি প্রতিস্থাপন করে ...

echo "$opt" | sed -r 's/^"|"$//g'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.