ফাইলের চেয়ে স্ট্রিং ভেরিয়েবলের উপর সেড ব্যবহার করুন


30

আমাকে বলা হয়েছিল এটি সম্ভব ছিল, তবে একক কাজের উদাহরণ sedছাড়াই কোনও স্ট্রিং ভেরিয়েবল থেকে ইনপুট ফাইলের প্রয়োজন ছাড়াই পড়তে পারে। আমি এখনও এটি কাজ পেতে। সাধারণ সুরক্ষার জন্য, আমি $PATHভেরিয়েবলটি অন্য ভেরিয়েবলটিতে লিখছি , কারণ আমি এটির সাথে ঝামেলা করছি কারণ এটি কীভাবে করা যায় তা সঠিকভাবে না জানা পর্যন্ত আমার অন্যান্য সমস্যা দেখা দেওয়ার দরকার নেই।

নিম্নোক্ত বিবেচনা কর:

~$x=$PATH
~$sed -i 's/:/ /g' $x

এটি এতে ব্যর্থ হয়: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই।

আমি চেষ্টা করেছি এমন আরও কয়েক জন এখানে রয়েছে:

~$ sed -i 's/:/ /g' | (read x) 
sed: no input files
~$ sed -i 's/:/ /g' | (read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x) 
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x 
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x) 
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x)) 
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x)) 
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x)) 
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' |  echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files

এটি কি কাজ করতে পারে? আমি কেবল ফাইলগুলি লেখার প্রয়োজন নেই আমার কেবল প্রয়োজন নেই যাতে আমি সেড ব্যবহার করতে পারি। এই নির্দিষ্ট উদাহরণের জন্য, যদি ~$x=$PATH ~$sed -i 's/:/ /g' $xআমি বাস্তবে আশা করি যেভাবে কাজ করে তবে আমি পেতাম:

/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games

যা আমি তখন একটি ভেরিয়েবলকে বরাদ্দ করতে এবং ভবিষ্যতের কমান্ডগুলিতে ব্যবহার করতে পারি use ls $x


1
x=$(echo "$x" | sed 's/:/ /g')?
হিমেইল

উত্তর:


16

হতে পারে:

~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games

@ জওহ --- লক্ষ্য করুন যে sedএখানে "স্ট্রিং ভেরিয়েবল" (?) এ কাজ করা হচ্ছে না, তবে স্ট্যান্ডার্ড ইনপুট --- যা এটি হওয়া উচিত।
রোমানো

আমি মনে করি আমি
সেড দেবগণের

4
@ j0h এর সাথে কোন যোগসূত্র নেই sed, শেল কীভাবে ইনপুটটিকে পুনঃনির্দেশ করে এটি একটি প্রশ্ন। sedইনপুট স্ট্রিমগুলির সাথে ডিল করে এবং এটি সেটিকে এটির স্ট্যান্ডার্ড ইনপুট দিয়ে পড়ে। সেগুলি ফাইল হোক বা না তা অপ্রাসঙ্গিক। এটি স্ট্যান্ডার্ড ইনপুট এর মাধ্যমে যতক্ষণ না আসে তা গ্রহণ করতে পারে।
টেরডন

38

এর সাথে এর কোনও সম্পর্ক নেই sed, এটি স্ট্যান্ডার্ড ইনপুট পড়ার কোনও প্রোগ্রামে প্রযোজ্য। যাইহোক, আপনি যা খুঁজছিলেন তা হ'ল

sed 's/:/ /g' <<<"$PATH"

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

আমি U&L এ একটি উত্তর লিখেছি যা এই জাতীয় সমস্ত শেল অপারেটরকে তালিকাভুক্ত করে। আপনি দেখতে চান হতে পারে।

নোট করুন যে আপনিও করতে পারতেন

echo "$PATH" | sed 's/:/ /g' 

শেষ অবধি, এর জন্য আপনার সত্যিই মোটেই প্রয়োজন নেই sed। আপনি সরাসরি ব্যাশে পুরো কাজটি করতে পারেন:

echo "${PATH//:/ }"

উপরের একটি ব্যাশ প্রতিস্থাপন নির্মাণ। এর সাথে সমস্ত উপস্থিতি প্রতিস্থাপন করতে একটি ভেরিয়েবল $var, একটি প্যাটার্ন patএবং একটি প্রতিস্থাপন ( rep) দেওয়া হয়েছে , আপনি তা করবেনpatrep

echo "${var//pat/rep}"

একক স্ল্যাশের সাথে একই জিনিসটি কেবল প্রথম ঘটনাকে প্রতিস্থাপন করে:

echo "${var/pat/rep}"

2
'বাশ রিপ্লেসমেন্ট কনস্ট্রাক্ট' এর জন্য ধন্যবাদ। আমি প্রথম ব্যাগটিকে পরবর্তী পরামিতিগুলিতে পরিবর্তন করতে বাশ ফাংশনে "$ {1 / থেকে / to}" ব্যবহার করতে সক্ষম হয়েছি।
এএএফারমক্লাব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.