আমি $PATH
আলাদা করে কীভাবে বিভিন্ন পাথগুলি তালিকাভুক্ত করব তা বুঝতে পারি না যাতে এগুলি দেখতে দেখতে:
/bin
/usr/bin
/usr/local/bin
প্রভৃতি
কেউ কি এর জন্য সঠিক পরিবর্তনশীল জানেন?
আমি $PATH
আলাদা করে কীভাবে বিভিন্ন পাথগুলি তালিকাভুক্ত করব তা বুঝতে পারি না যাতে এগুলি দেখতে দেখতে:
/bin
/usr/bin
/usr/local/bin
প্রভৃতি
কেউ কি এর জন্য সঠিক পরিবর্তনশীল জানেন?
উত্তর:
চেষ্টা করুন sed
:
$ sed 's/:/\n/g' <<< "$PATH"
বা tr
:
$ tr ':' '\n' <<< "$PATH"
বা python
:
$ python2 -c "import os; print os.environ['PATH'].replace(':', '\n')"
এখানে উপরের সমস্তগুলি :
নতুন লাইনের সাথে সমস্ত ঘটনাকে প্রতিস্থাপন করবে \n
।
python -c 'import sys;print sys.argv[1].replace(":","\n")' $PATH
python -c "print r'$PATH'.replace(':', '\n')"
(ব্যাকস্ল্যাশগুলির ক্ষেত্রে কাঁচা স্ট্রিং ব্যবহার করে)
tr
আমার জন্য কাজ (ম্যাক, বিটিডাব্লু)। ধন্যবাদ।
.bash_profile
জন্য এটি যুক্ত করুন:alias path='tr ":" "\n" <<< "$PATH"'
ব্যাশের প্যারামিটার সম্প্রসারণ ব্যবহার করুন :
echo "${PATH//:/$'\n'}"
এই সব প্রতিস্থাপন :
মধ্যে $PATH
একটি newline (দ্বারা \n
) এবং কপি করে প্রিন্ট ফলাফল। সামগ্রীর $PATH
অপরিবর্তিত রয়েছে।
আপনি যদি কেবল প্রথমটি প্রতিস্থাপন করতে চান :
তবে দ্বিতীয় স্ল্যাশ সরিয়ে ফেলুন:echo -e "${PATH/:/\n}"
${parameter/pattern/string}
আইএফএস ব্যবহার:
(set -f; IFS=:; printf "%s\n" $PATH)
IFS
বাশ বিভক্ত করে এমন অক্ষর ধারণ করে, যাতে একটি IFS
দিয়ে :
বাশ $PATH
অন প্রসারিতকে বিভক্ত করে :
। printf
আর্গুমেন্টগুলি শেষ হয়ে না যাওয়া পর্যন্ত ফর্ম্যাট স্ট্রিংয়ের উপর আর্গুমেন্টগুলি লুপ করে। আমাদের ব্যবহার করে গ্লোববিং (ওয়াইল্ডকার্ড সম্প্রসারণ) অক্ষম করা দরকার set -f
যাতে PATH ডিরেক্টরিগুলির নামের ওয়াইল্ডকার্ডগুলি প্রসারিত না হয়।
ব্যবহার xargs
:
xargs -n1 -d: <<< $PATH
থেকে man xargs
-n max-args
Use at most max-args arguments per command line.
-d delim
Input items are terminated by the specified character.
echo $PATH | xargs -n1 -d: echo
অনর্থক হতে পারে বা তাতে কিছু আসে যায় না?
echo $PATH | xargs -n1 -d:
আপনার জন্য একই কাজ করবে তবে আপনি আরও একটি শেল ব্যবহার করবেন। প্রথমটি মূল্যায়ন করবে echo $PATH
এবং বাকীটি করার জন্য পরবর্তী শেলটিতে আউটপুট পাইপ করবে ।
এখানে গো সমতুল্য:
$ cat path.go
package main
import (
"fmt"
"os"
"strings"
)
func main() {
for _, p := range strings.Split(os.Getenv("PATH"), ":") {
fmt.Println(p)
}
}
$ go run path.go
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/home/nathan/.local/bin
/home/nathan/go/bin
এখানে আরও কয়েকটি পন্থা দেওয়া হল। আমি PATH
ব্যাকস্ল্যাশ, স্পেস এবং একটি নতুন লাইন সম্বলিত একটি ডিরেক্টরি ব্যবহার করছি যা দেখানোর জন্য যে তাদের যে কোনও কিছুর সাথে কাজ করা উচিত (নতুন লাইনে cut
ব্যর্থ হওয়া ব্যতীত ):
$ echo "$PATH"
/bin:usr/bin/:/usr/local/bin:/some\ horrible thing:/even
new lines
কিছু পার্ল উপায়:
$ perl -pe 's/:/\n/g' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
এর -p
অর্থ "প্রদত্ত স্ক্রিপ্ট প্রয়োগের পরে প্রতিটি ইনপুট লাইন মুদ্রণ করুন -e
"। স্ক্রিপ্টটি নতুন লাইনের সাহায্যে প্রতিস্থাপন অপারেটর ( s/oldnew/
) ব্যবহার করে :
।
$ perl -lne 'print for split /:/' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
-l
প্রতিটি একটি newline যোগ print
কল। এখানে, স্ক্রিপ্টটি তার ইনপুটটি বিভক্ত করছে :
এবং তারপরে প্রতিটি বিভক্ত উপাদানকে লুপ করে এটিকে মুদ্রণ করবে।
$ perl -F: -ane '$"="\n";print "@F"' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
-a
তোলে perl
মত আচরণ awk
: এটা কর্তৃক প্রদত্ত চরিত্র তার ইনপুট লাইনের প্রতিটি বিভক্ত হবে -F
(তাই :
, এখানে) এবং অ্যারের মধ্যে সংরক্ষণ করতে @F
। এটি $"
হ'ল একটি বিশেষ পার্ল ভেরিয়েবল, "তালিকা বিভাজক", যার মান মুদ্রিত তালিকার প্রতিটি উপাদানগুলির মধ্যে মুদ্রিত হয়। সুতরাং এটি একটি নতুন লাইনে সেট করা print @list
প্রতিটি উপাদান @list
এবং তারপরে একটি নতুন লাইন প্রিন্ট করবে । এখানে, আমরা এটি মুদ্রণের জন্য ব্যবহার করছি @F
।
$ perl -F: -ane 'print join "\n", @F' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
উপরের মত একই ধারণা, কেবল কম গল্ফড। ব্যবহারের পরিবর্তে $"
, আমরা স্পষ্টভাবে join
নিউলাইনগুলি এবং তারপরে মুদ্রণের সাথে অ্যারে যুক্ত করছি with
grep
পিসিআরই যাদুতে সহজ :
$ grep -oP '(^|:)\K[^:]+' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
-o
তোলে grep
, প্রতিটি লাইনের শুধুমাত্র ম্যাচিং অংশ প্রিন্ট তাই প্রতিটি ম্যাচ একটি পৃথক লাইন ছাপা হয়। -P
পার্ল সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশন (PCRE) সক্ষম করে। রেজেক্স নন- :
( [^:]+
) এর প্রসারগুলি সন্ধান করছে যা লাইন ( ^
) বা কোনও :
অক্ষরের শুরুর পরে অনুসরণ করে । \K
একটি PCRE কৌতুক "এই বিন্দু আগে মিলেছে বাতিল কিছু" মানে এবং প্রিন্টিং এড়াতে এখানে ব্যবহার করা হয় :
হিসাবে ভাল।
এবং একটি cut
সমাধান (এটি একটি নতুন লাইনে ব্যর্থ, তবে ব্যাকস্ল্যাশ এবং স্পেসগুলি মোকাবেলা করতে পারে):
$ cut -d: -f 1- --output-delimiter=$'\n' <<<"$PATH"
/bin
usr/bin/
/usr/local/bin
/some\ horrible thing
/even
new lines
ব্যবহৃত বিকল্পগুলি হ'ল যা -d:
ইনপুট ডিলিমিটার সেট করে :
, -f 1-
যার অর্থ সমস্ত ক্ষেত্র মুদ্রণ করা (প্রথম থেকে শেষ পর্যন্ত) এবং --output-delimiter=$'\n'
যা ভাল, আউটপুট ডিলিমিটার সেট করে। $'\n'
হয় ANSI সি উদ্ধৃত এবং একটি উপায় শেল মধ্যে একটি newline অক্ষর প্রিন্ট করতে হয়।
উপরের সমস্ত উদাহরণগুলিতে, আমি প্রোগ্রামের ইনপুট হিসাবে একটি স্ট্রিং পাস করতে এখানে বাশের (এবং কিছু অন্যান্য শেলস) এখানে স্ট্রিং ( <<<
) অপারেটর ব্যবহার করছি। সুতরাং command <<<"foo"
সমতূল্য echo -n "foo" | command
। মনে রাখবেন যে আমি সর্বদা উদ্ধৃতি দিচ্ছি "$PATH"
, উদ্ধৃতিগুলি না থাকলে শেলটি নতুন লাইনের চরিত্রটি খেয়ে ফেলত।
@ 7 স্টুড মন্তব্যগুলিতে আরেকটি পন্থা দিয়েছেন যা অন্তর্ভুক্ত না করা খুব ভাল:
$ perl -0x3a -l012 -pe '' <<<"$PATH"
এটিই গল্ফিং নামে পরিচিত । -0
একটি অকট্যাল বা হেক্সাডেসিমেল সংখ্যা হিসাবে ইনপুট রেকর্ড বিভাজক নির্দিষ্ট করে। এটি একটি "লাইন" সংজ্ঞায়িত করে এবং এর ডিফল্ট মান হ'ল \n
একটি নতুন লাইন চরিত্র। এখানে, আমরা এটিকে সেটিং করছি :
যা x3a
এ হেক্স (চেষ্টা printf '\x3a\n'
)। -l
তিনটি জিনিস আছে। প্রথমে এটি $/
প্রতিটি লাইনের প্রান্ত থেকে ইনপুট রেকর্ড বিভাজক ( ) সরিয়ে দেয় :
here কার্যকরভাবে এখানে সরিয়ে দেয় — এবং দ্বিতীয়টি, এটি আউটপুট রেকর্ড বিভাজক ( $\
) সেট করে যা যা অষ্টাল বা হেক্স মান দেওয়া হয় তা ( 012
হয় \n
)। যদি $\
সংজ্ঞায়িত করা হয় তবে এটি প্রতিটি print
কলের শেষে যুক্ত করা হয় , সুতরাং এটি প্রতিটিটিতে একটি নতুন লাইন যুক্ত হবে print
।
-pe
ইচ্ছা পি স্ক্রিপ্ট দেওয়া প্রয়োগের পরে প্রতিটি ইনপুট লাইন দ্রণ -e
। এখানে কোনও স্ক্রিপ্ট নেই কারণ সমস্ত কাজটি উপরে বর্ণিত হিসাবে বিকল্পের পতাকা দ্বারা করা হয়!
perl -0x3a -l012 -pe '' <<<$PATH
। ব্যাখ্যা: -0
ইনপুট রেকর্ড বিভাজক সেট করে (হেক্স / অক্টাল নোটেশনে উল্লিখিত, এক্স 3 এ কোলন রয়েছে), -l
দুটি কাজ করে: 1) এটি ইনপুট রেকর্ড বিভাজককে চম্পস করে, 2) এটি নির্দিষ্ট করা থাকলে আউটপুট রেকর্ড বিভাজককে সেট করে (অষ্টাল নোটেশনে , 012 একটি নতুন লাইন)। একটি -p
$: _ মূল্য যা প্রতিটি হতে হবে আউট লুপ কপি করে প্রিন্ট লাইন পড়া।
-F
তথ্যের জন্য ধন্যবাদ । আমি বছরের পর বছর ধরে -F
সম্মিলিতভাবে ব্যবহার করছি -an
, আমি কখনই বুঝতে পারি নি যে এটি অন্যকে বোঝায়। যাইহোক, আমি সার্গের কোড গল্ফ উল্লেখ করেছেন দেখেছি , তবে আমি মনে করি আপনি যদি এই ধরণের জিনিসটিতে থাকেন তবে আপনি ইউনিক্স এবং লিনাক্সও উপভোগ করবেন ।
-l
প্রতিটি মুদ্রণ কল শেষে প্রদত্ত আউটপুট রেকর্ড বিভাজক যুক্ত করে। প্রকৃতপক্ষে, মুদ্রণ সবসময় আউটপুট রেকর্ড বিভাজক যুক্ত করে, $/
একটি স্ট্রিংয়ের শেষে - যদি আউটপুট রেকর্ড বিভাজককে সংজ্ঞায়িত করা হয়। ডিফল্টরূপে এটি অপরিশোধিত। সুতরাং -l
জাস্ট সেট করে $/
এবং এর ফলে মুদ্রণটি স্ট্রিংয়ের শেষে নতুন লাইন যুক্ত করে।
যেহেতু সমস্ত স্ক্রিপ্টিং ভাষা ইতিমধ্যে নেওয়া হয়েছে, তাই আমি সি এর সাথে যাব get_env()
ফাংশন সহ পরিবেশের ভেরিয়েবলগুলি পাওয়া খুব সহজ ( জিএনইউ সি লাইব্রেরির ডকুমেন্টেশন দেখুন )। বাকিটি কেবল চরিত্রের কারসাজি
bash-4.3$ cat get_path.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *path = getenv("PATH");
int length = strlen(path) -1;
for(int i=0;i<=length;i++){
if (path[i] == ':')
path[i] = '\n';
printf("%c",path[i]);
}
printf("\n");
return 0;
}
bash-4.3$ gcc get_path.c
bash-4.3$ ./a.out
/home/xieerqi/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/opt/microchip/xc16/v1.25/bin
/opt/microchip/xc32/v1.40/bin
/opt/microchip/xc8/v1.35/bin
/home/xieerqi/bin
/home/xieerqi/bin/sh
তবে "কেন নয়" কারণ, এখানে কমান্ড লাইন আর্গুমেন্টের মাধ্যমে বিকল্প পাইথন সংস্করণ sys.argv
python -c 'import sys; print "\n".join(sys.argv[1].split(":"))' "$PATH"
সি সংকলক এবং পাইথন ইন্টারপ্রেটারের বিপরীতে রুবি ডিফল্টরূপে উবুন্টুর সাথে আসে না, তবে আপনি যদি কখনও নিজেকে এটি ব্যবহার করে দেখতে পান তবে রুবির সমাধানটি হ'ল:
ruby -ne 'puts $_.split(":")' <<< "$PATH"
7stud দ্বারা প্রস্তাবিত হিসাবে (আপনি আপনাকে অনেক ধন্যবাদ!) এ মন্তব্য , এটি সঙ্গে সংক্ষিপ্ত করা যেতে পারে
ruby -F: -ane 'puts $F' <<<$PATH
এবং এই ভাবে
ruby -0072 -ne 'puts chomp' <<<$PATH
split()
অ্যারেতে পঠিত লাইনটি ভাঙ্গতে আমরা ফাংশনটি ব্যবহার করতে পারি এবং for-each
প্রতিটি আইটেমকে আলাদা লাইনে মুদ্রণ করতে লুপ ব্যবহার করতে পারি।
awk '{split($0,arr,":"); for(var in arr) print arr[var]}' <<< $PATH
puts
স্বয়ংক্রিয়ভাবে আলাদা লাইনে একটি অ্যারের উপাদানগুলি মুদ্রণ করে! আপনি সুইচগুলি বিভাজনটিও করতে পারেন: ruby -F: -ane 'puts $F' <<<$PATH
ব্যাখ্যা: নির্দিষ্ট বর্ণকে -F
সেট $;
করে, যা স্ট্রিং :: স্প্লিট দ্বারা ব্যবহৃত ডিফল্ট বিভাজক ($; শূন্যস্থানতে বিভাজিত) এর একটি ডিফল্ট মান থাকে। -a
কলকে $ _। বিভক্ত করুন, যেখানে $ _ একটি লাইনটি get ()) ব্যবহার করে পড়ে এবং ফলাফলটি অ্যারে নির্ধারিত করে $F
।
-F
পতাকা আছে তা জানতাম না - আমি কেবল রুবির সাথেই শুরু করছি, তাই কিছুটা অপরিশোধিত উপায়ে কাজ করছি।
ruby -0072 -ne 'puts chomp' <<<$PATH
। ব্যাখ্যা: -0
ইনপুট রেকর্ড বিভাজক সেট করে (অষ্টাল বিন্যাসে একটি অক্ষর নির্দিষ্ট করুন; 072 কোলন হয়)। রুবি পার্লের অনুরূপ উপায়ে $ _ নিয়োগ করে। পায় () পদ্ধতিটি (লুপটিতে ব্যবহৃত -n
) বর্তমান পংক্তিতে to _ সেট করে read _ সেট করে And এবং chomp()
কোনও আর্গ, চম্পস ছাড়াই। _। আমি এখনও আপনার ভাল পছন্দ। :)
-F
পতাকা সহ প্রথম পোস্ট করেছিলেন , তা খাটো। যদি আপনি echo "ruby -F: -ane 'puts $F' <<<$PATH" |wc -c
এটি করেন তবে এটি আমাকে 271, বাইট বলে, তবে অষ্টাল সংখ্যাটি একটি 276 That's এটি পুরো কমান্ডের জন্য অবশ্যই, যদি আমরা কেবল কোডটি বিবেচনা করি তবে puts $F
এটি স্পষ্টভাবে খাটো। :) যাইহোক, আপনি কোড গল্ফ সম্পর্কে জানেন ? এটি সর্বনিম্ন সংখ্যা বাইটে প্রোগ্রামিং ধাঁধা সমাধানের জন্য সাইট। : এই এক সংক্রান্ত প্রশ্ন codegolf.stackexchange.com/q/96334/55572
সম্ভবত একমাত্র উপায় যা উল্লেখ করা হয়নি তা হ'ল আমি বছরের পর বছর ধরে এটি ব্যবহার করে চলেছি:
echo $PATH | tr ":" "\n"
সুতরাং, আপনার। প্রোফাইলে বা .বাশ_প্রফাইলে বা যাই হোক না কেন, আপনি যুক্ত করতে পারেন:
alias path='echo $PATH | tr ":" "\n"'
আমাদের আরও জাভা দরকার!
public class GetPathByLine {
public static void main(String[] args) {
for (String p : System.getenv("PATH").split(":")) {
System.out.println(p);
}
}
}
এটিতে সংরক্ষণ করুন GetPathByLine.java
এবং ব্যবহার করে সংকলন করুন:
javac GetPathByLine.java
সাথে চালান:
java GetPathByLine
┌─[17:06:55]─[kazwolfe@BlackHawk]
└──> ~ $ cat GetPathByLine.java
public class GetPathByLine {
public static void main(String[] args) {
for (String p : System.getenv("PATH").split(":")) {
System.out.println(p);
}
}
}
┌─[17:06:58]─[kazwolfe@BlackHawk]
└──> ~ $ javac GetPathByLine.java
┌─[17:07:02]─[kazwolfe@BlackHawk]
└──> ~ $ java GetPathByLine
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
python3 -c "import os; [print(p) for p in os.getenv('PATH').split(':')]"
অজস্র মাধ্যমে।
echo $PATH | awk -F: '{for(i=1;i<=NF;i++)print $i}'
অজগর মাধ্যমে।
$ echo $PATH | python3 -c 'import fileinput
for line in fileinput.input():
for i in line.split(":"):
print(i)'
দ্রষ্টব্য যে পাইথন ইনডেন্টেশন খুব গুরুত্বপূর্ণ।
echo $PATH | awk '{gsub(/\:/,"\n");print}'
fileinput
আপনি ঠিক যখন ব্যবহার করতে পারলেন তখন কেন আপনি বিরক্ত হবেন তা নিশ্চিত নই input
:python3 -c 'print(*input().split(":"), sep="\n")' <<< "$PATH"
আমি স্টিফেন কলির "বাশ পাথ ফাংশন" ব্যবহার করি ( লিনাক্স জার্নালে তার নিবন্ধটি দেখুন )। এটি শেল প্রোগ্রামিংয়ে ডেটাটাইপ হিসাবে "কোলন বিচ্ছিন্ন তালিকা" ব্যবহার করার অনুমতি দেয়। উদাহরণস্বরূপ, আমি বর্তমান ডিরেক্টরিতে সমস্ত ডিরেক্টরি একটি তালিকা উত্পাদন করতে পারেন:
dirs="";for i in * ; do if [ -d $i ] ; then addpath -p dirs $i; fi; done
তারপরে, listpath -p dirs
একটি তালিকা তৈরি করে।
@ সাইরাস উত্তরের ব্যাখ্যা
echo "${PATH//:/$'\n'}"
নোট:
এএনএসআই-সি উদ্ধৃতি - এটি some 'কিছু te ntext' ব্যাখ্যা করে
শেল প্যারামিটার সম্প্রসারণ - এটি $ {প্যারামিটার / প্যাটার্ন / স্ট্রিং explains ব্যাখ্যা করে, যদি প্যাটার্নটি '/' দিয়ে শুরু হয় তবে প্যাটার্নের সমস্ত ম্যাচ স্ট্রিংয়ের সাথে প্রতিস্থাপিত হবে।
তাহলে আমাদের আছে:
অন্য AWK উপায় হ'ল প্রতিটি ডিরেক্টরিকে আলাদা ক্ষেত্র হিসাবে না বরং পৃথক রেকর্ড হিসাবে বিবেচনা করা ।
awk 'BEGIN{RS=":"} {print $0}' <<<"$PATH"
আমি সিনট্যাক্সটি বিশেষভাবে স্বজ্ঞাত বলে মনে করি। তবে, যদি আপনি চান, তবে আপনি এটি অন্তর্ভুক্ত করে সংক্ষিপ্ত করতে পারেন print $0
(এটি ডিফল্ট ক্রিয়া এবং 1
সত্যকে মূল্যায়ন করে এটি প্রতিটি লাইনের জন্য সম্পন্ন করে):
awk 'BEGIN{RS=":"} 1' <<<"$PATH"
এডব্লিউকে এর ডিফল্ট ইনপুট এবং আউটপুট রেকর্ড বিভাজক হ'ল নতুন লাইন (লাইন ব্রেক)। ইনপুটটি পড়ার আগে ইনপুট রেকর্ড বিভাজক ( RS
) সেট করে :
, এডাব্লুকে স্বয়ংক্রিয়ভাবে $PATH
তার গঠন নির্দেশক নামগুলিতে একটি কোলন-সীমাবদ্ধ পার্স করে । এডব্লু $0
কে প্রতিটি পুরো রেকর্ডে প্রসারিত হয়, নতুন লাইন আউটপুট রেকর্ড বিভাজক হিসাবে থাকে এবং কোনও লুপিং বা gsub
প্রয়োজন হয় না।
ek@Io:~$ echo "$PATH"
/home/ek/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ek@Io:~$ awk 'BEGIN{RS=":"} {print $0}' <<<"$PATH"
/home/ek/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
এডাব্লুকে প্রায়শই পৃথক ক্ষেত্রগুলিতে রেকর্ড বিশ্লেষণ করতে ব্যবহৃত হয়, তবে কেবল ডিরেক্টরি নামের একটি তালিকা তৈরি করার প্রয়োজন নেই।
এটি ফাঁকা (ফাঁকা স্থান এবং ট্যাবগুলি) এমনকি একাধিক পরপর শূন্যস্থানযুক্ত ইনপুটটির জন্যও কাজ করে:
ek@Io:~$ awk 'BEGIN{RS=":"} {print $0}' <<<$'ab\t\t c:de fg:h'
ab c
de fg
h
এটি হ'ল যদি না আপনি AWK রেকর্ডটি পুনর্নির্মাণ করতে (নীচে দেখুন) না করেন তবে ইনপুটে স্পেস বা ট্যাব (ডিফল্ট ক্ষেত্র বিভাজক) থাকা কোনও সমস্যা নয়। আপনার PATH
সম্ভবত কোনও উবুন্টু সিস্টেমে স্পেস নেই, তবে যদি এটি হয় তবে এটি এখনও কার্যকর হবে।
পার্শ্ব নোট হিসাবে এটি উল্লেখ করার মতো, ক্ষেত্রের সংগ্রহ হিসাবে AWK এর রেকর্ডটি ব্যাখ্যা করার ক্ষমতা ডিরেক্টরি উপাদানগুলির একটি টেবিল তৈরির সম্পর্কিত সমস্যার জন্য দরকারী হয়ে ওঠে :
ek@Io:~$ awk -F/ 'BEGIN{RS=":"; OFS="\t"} {$1=$1; print $0}' <<<"$PATH"
home ek bin
usr local sbin
usr local bin
usr sbin
usr bin
sbin
bin
usr games
usr local games
snap bin
কৌতূহলী $1=$1
অ্যাসাইনমেন্টটি রেকর্ডটি পুনর্নির্মাণে এডাব্লুকে বাধ্য করার উদ্দেশ্যে কাজ করে ।
(কেবলমাত্র টেবিল প্রিন্ট করার সঠিক উদাহরণের চেয়ে উপাদানগুলির জন্য অতিরিক্ত প্রক্রিয়াজাতকরণ করা ক্ষেত্রে এটি সম্ভবত আরও কার্যকর)
jq -Rr 'gsub(":";"\n")' <<<$PATH
কীভাবে $ PATH এ পাথগুলি আলাদাভাবে প্রদর্শন করবেন
এগুলি আমার নিজের ব্যবহারের ক্ষেত্রে এবং সামঞ্জস্যতা এবং সংস্থান ব্যবহার সম্পর্কে উদ্বেগের ভিত্তিতে এটি করার আমার পছন্দের উপায়।
tr
প্রথমত, আপনার যদি দ্রুত প্রয়োজন, সহজে মনে রাখার জন্য, এবং পাঠযোগ্য সমাধান, শুধু echo PATH
এবং পাইপ এটি অনুবাদ করুন ( tr
) নতুন লাইন মধ্যে কোলন চালু করতে:
echo $PATH | tr : "\n"
পাইপের কারণে এটিতে দুটি প্রক্রিয়া ব্যবহার করার ক্ষয়ক্ষতি রয়েছে তবে আমরা যদি কেবলমাত্র একটি টার্মিনালে হ্যাক করি তবে আমরা কি সত্যিই সেটার যত্ন নিই?
.bashrc
ইন্টারেক্টিভ ব্যবহারের জন্য যদি আপনি মোটামুটি স্থায়ী সমাধান চান তবে নীচের কমান্ডটি আপনার কাছে ব্যবহার করতে পারেন path
, তবে এই সমাধানটির পঠনযোগ্যতা প্রশ্নবিদ্ধ:
alias path="echo \"${PATH//:/$'\n'}\""
যদি প্যাটার্নটি '/' দিয়ে শুরু হয় তবে প্যাটার্নের সমস্ত ম্যাচ স্ট্রিংয়ের সাথে প্রতিস্থাপিত হবে। সাধারণত প্রথম ম্যাচটি প্রতিস্থাপন করা হয়।
উপরের কমান্ডটি বাশের শেল প্যারামিটার এক্সপেনশন ব্যবহার করে নতুন লাইনগুলি সহ কোলনকে প্রতিস্থাপন করে :
${parameter/pattern/string}
এটি ব্যাখ্যা করতে:
# v--v---------delimiters, a'la sed
echo "${PATH//:/$'\n'}"
# ^^ ^^^^^----string, $ required to get newline character.
# \----------pattern, / required to substitute for *every* :.
যদিও আপনি কেবল কমান্ড লাইনে হ্যাক করছেন ঠিক আছে তা মনে রাখার জন্য সৌভাগ্য।
বিকল্পভাবে, মোটামুটি ক্রস-সামঞ্জস্যপূর্ণ, পঠনযোগ্য এবং বোধগম্য পদ্ধতির যা শেল ছাড়া অন্য কোনও কিছুর উপর নির্ভর করে না নীচের ফাংশনটি ব্যবহার করুন (আমি আপনাকে প্রস্তাব দিই .bashrc
।)
নিম্নলিখিত ফাংশনটি অস্থায়ীভাবে অভ্যন্তরীণ (বা ইনপুট) ফিল্ড বিভাজক (আইএফএস) একটি কোলন করে তোলে এবং যখন অ্যারে দেওয়া হয় printf
, অ্যারেটি ব্যবহার না করা অবধি এটি সম্পাদন করে:
path () {
local IFS=:
printf "%s\n" ${PATH}
}
এই পদ্ধতি ফাংশন সৃষ্টি , IFS
এবং printf
জন্য posix দ্বারা, প্রদান করা হয়, তাই এটি (যেমন বিশেষত ড্যাশ, যা উবুন্টু সাধারণত alias লেখা সবচেয়ে posix মত শাঁস মধ্যে কাজ করা উচিত sh
)।
এর জন্য আপনার কি পাইথন ব্যবহার করা উচিত? আপনি পারে। এটি এর জন্য আমি সবচেয়ে সংক্ষিপ্ত পাইথন কমান্ডটি ভাবতে পারি:
python -c "print('\n'.join('${PATH}'.split(':')))"
বা পাইথন 3 কেবল (এবং সম্ভবত আরও পাঠযোগ্য)?
python3 -c "print(*'${PATH}'.split(':'), sep='\n')"
এগুলি যে কোনও সাধারণ শেল পরিবেশেও কাজ করা উচিত, যতক্ষণ আপনার অজগর থাকে।
এই সমাধানটি জাভা , সি , গো এবং অজানা সমাধানগুলির চেয়ে সহজ :
$ LPATH=$PATH wine cmd /c echo %LPATH::=$'\n'% 2> /dev/null
/usr/local/bin
/usr/local/sbin
/usr/bin
/usr/sbin
এখানে আরও একটি দুর্দান্ত সম্ভাবনা রয়েছে:
$ jrunscript -classpath /usr/share/java/bsh.jar -e 'print(java.lang.System.getenv("PATH").replaceAll(":","\n"))'
/usr/local/bin
/usr/local/sbin
/usr/bin
/usr/sbin
এটির জন্য কিছু নির্ভরতা ইনস্টল করা প্রয়োজন:
sudo apt-get install openjdk-8-jdk-headless bsh