সেড দিয়ে ব্যাশ ভেরিয়েবল প্রসেসিং করা হচ্ছে


16

ব্যাশ ভেরিয়েবল LATLNG এর মতো বন্ধনীগুলিতে একটি অক্ষাংশ এবং দ্রাঘিমাংশ মান থাকে

(53.3096,-6.28396)

আমি এগুলিকে LAT এবং LON নামক একটি ভেরিয়েবলে পার্স করতে চাই যা আমি সেডের মাধ্যমে করার চেষ্টা করছি

LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG")
LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG")

তবে, আমি নিম্নলিখিত ত্রুটি পেয়েছি:

sed: can't read (53.3096,-6.28396): No such file or directory


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

কোথা থেকে এই মানগুলি আসে? মূল উত্স থেকে অক্ষাংশ এবং দ্রাঘিমাংশের মানগুলিকে bashভেরিয়েবেলে রেখে অতিরিক্ত পদক্ষেপ যুক্ত করার চেয়ে পার্স করা আরও দক্ষ হবে ।
কুসালানন্দ

উত্তর:


18

এটি খাঁটি শেল সিনট্যাক্সের মাধ্যমে সমাধান করা যেতে পারে। এটি বন্ধনী (বন্ধনী) এর কারণে একটি অস্থায়ী পরিবর্তনশীল প্রয়োজন যদিও:

#!/bin/bash

LATLNG="(53.3096,-6.28396)"

tmp=${LATLNG//[()]/}
LAT=${tmp%,*}
LNG=${tmp#*,}

বিকল্পভাবে, আপনি বিল্টিন সহ খেলতে IFSএবং ব্যবহার করে একযোগে এটি করতে পারেন read:

#!/bin/bash

LATLNG="(53.3096,-6.28396)"

IFS='( ,)' read _ LAT LNG _ <<<"$LATLNG"

প্রথম উদাহরণটি পশিক্স শেল নয়, কেবল ব্যাশে কাজ করবে।
জেলরেন

1
@Gelraen অতএব#!/bin/bash
সিজেক্সএক্স

এখানে আরও বিস্তৃতি দেখুন: gnu.org/software/bash/manual/…
রিকার্ডো স্টুভেন

22

এই বিশেষ ক্ষেত্রে সিয়েজএক্সের উত্তর আরও ভাল, তবে কীভাবে স্বেচ্ছাসেবী পাঠ্যে পাঠানো যায় তাও আপনার জানা উচিত sed

sedএটি দ্বিতীয়, তৃতীয়, ইত্যাদি পরামিতি হিসাবে ফাইলের নামগুলি প্রত্যাশা করে এবং যদি এটি কোনও ফাইলের নাম খুঁজে না পায় তবে এটি তার স্ট্যান্ডার্ড ইনপুট থেকে পড়ে। সুতরাং যদি আপনার কাছে এমন পাঠ্য রয়েছে যা আপনি কোনও ফাইলের মধ্যে না প্রক্রিয়া করতে চান তবে আপনাকে এটিতে পাইপ করতে হবে sed। সবচেয়ে সোজা উপায় হ'ল:

echo "blah blah" | sed 's/blah/blam/g'

সুতরাং আপনার উদাহরণ হয়ে উঠবে:

LAT=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\1/g')
LON=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\2/g')

বিকল্প (আরও ভাল তবে আরও অস্পষ্ট) পদ্ধতি

যদি আপনি ভাবেন যে কোনও সম্ভাবনা আছে যা $LATLNGড্যাশ দিয়ে শুরু হতে পারে, বা আপনি যদি পেডেন্টিক হতে চান তবে আপনার printfপরিবর্তে আপনার ব্যবহার করা উচিত echo:

printf '%s' "$LATLNG" | sed 's/foo/bar/g'

বা একটি "এখানে নথি", তবে আপনি যে নির্মাণটি ব্যবহার করছেন তা এটি কিছুটা বিশ্রী হতে পারে:

LAT=$(sed 's/foo/bar/g' <<END
$LATLNG
END
)

অথবা আপনি যদি ব্যবহার করছেন bashএবং বহনযোগ্যতার বিষয়ে উদ্বিগ্ন না হন তবে আপনি একটি "এখানে স্ট্রিং" ব্যবহার করতে পারেন:

sed 's/foo/bar/g' <<< "$LATLNG"

3

এখানে একটি সমাধান যা কোনও পসিক্স শেলটিতে কাজ করবে:

parse_coordinates () {
  IFS='(), '  # Use these characters as word separators
  set -f      # Disable globbing
  set $1      # Split $1 into separate words
  set +f      # Restore shell state
  unset IFS
  LAT=$2      # $1 is the empty word before the open parenthesis
  LON=$3
}
parse_coordinates "$LATLNG"

এখানে আরও একটি সমানভাবে বহনযোগ্য সমাধান যা ব্যবহৃত নির্দিষ্ট সিনট্যাক্সকে পার্স করে।

LAT=${LATLNG%\)}    # strip final parenthesis
LAT=${LAT#\(}       # strip initial parenthesis
LON=${LAT##*[, ]}   # set LON to everything after the last comma or space
LAT=${LAT%%[, ]*}   # set LAT to everything before the first comma or space

-1
LATLNG="(53.3096,-6.28396)"
set ${LATLNG//[(,)]/ }
LAT=$1
LON=$2

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