স্ক্রিপ্ট / ওরফে দিয়ে "foo.foo.foo" থেকে "foo foo foo" তে কিছু পাঠ্য পরিবর্তন করতে আমি কীভাবে বাশ / zsh পেতে পারি?


11

আমি হয়তো ব্যবহার করতে পারেন <বা >বা |। আমার কি গ্রিপ ব্যবহার করা দরকার?


2
আপনি একটি পাঠ্য বলতে কি বোঝাতে চান? একটি ফাইল বা একটি ফাইলের কিছু পাঠ্য? echo "foo.foo.foo" | sed 's/\./ /g'
Zanna

1
@ কেডিজি i) আপনার প্রতিটি এসই সাইটের জন্য পৃথক অ্যাকাউন্ট তৈরি করতে হবে তবে আপনি যদি একই শংসাপত্র ব্যবহার করেন তবে অ্যাকাউন্টগুলি লিঙ্ক করা হবে। ii) যদিও এই সাইটটি কেবল উবুন্টুতে সীমাবদ্ধ তবে আমি এখানে এমন কিছু দেখতে পাচ্ছি না যা আপনি উবুন্টু ব্যবহার করছেন না এমন অকাট্য প্রমাণ হতে পারে, সুতরাং এটি বন্ধ করার কোনও কারণ আমিও পাই না।
টেরডন

উত্তর:


20

আপনি একটি ফাংশন তৈরি করতে পারেন এবং আপনার শেষের দিকে যুক্ত করতে পারেন ~/.bashrc, উদাহরণস্বরূপ:

nodot() {  echo "$1" | sed 's/\./ /g' ; }

ব্যবহারের উদাহরণ:

$ nodot foo.foo.foo
foo foo foo

আপনি zsh এও এই ফাংশনটি ব্যবহার করতে পারেন, কেবল ~/.zshrcতার পরিবর্তে যুক্ত করুন।


6
@ টোবড্ট একটি গৃহীত উত্তর পরিবর্তন করে একে অন্য বর্তমান উত্তরের সাথে সম্পূর্ণরূপে প্রতিস্থাপন করা সহজভাবে করা হয় না।
মুরু

28

অক্ষর রূপান্তর করতে আপনি tr কমান্ড ব্যবহার করতে পারেন ।

% echo "foo.foo.foo" | tr '.' ' ' 
foo foo foo

শীতল টিপসগুলি "ট্র" এর আগে কখনও শুনেনি
কেডিজি

6
trআসলে এই উদ্দেশ্যে ঠিক বোঝানো হয়। sedওভারকিল
সর্বাধিক Ried 15

1
+1 অবিকল জন্য tr, এটি একটি খুব দরকারী সরঞ্জাম যা অনেক লোক কোনও কারণে জানতে পারে বলে মনে হয় না। sedপুরো শ্রেণীর অক্ষর রূপান্তর করার চেয়ে সহজ উপায় ।
ফ্লফি

5
আপনি যদি এটি 'awk' তে করতে পারেন তবে কখনও এটি 'সি' তে লিখবেন না; 'সেড' যদি এটি পরিচালনা করতে পারে তবে কখনই 'অবাক' এ এটি করবেন না; 'ট্র' যখন কাজটি করতে পারে তখন কখনও 'সেড' ব্যবহার করবেন না; 'বিড়াল' পর্যাপ্ত হলে 'ট্র' কে কখনই ডাকে না; যখনই সম্ভব 'বিড়াল' ব্যবহার করা এড়িয়ে চলুন। - টেলরস প্রোগ্রামিংয়ের আইন
রস প্রেসার

1
চমৎকার উত্তর. এই উত্তর গ্রহণ করা উচিত।
এসবিবি

24

খাঁটি বাশ ব্যবহার:

bash-3.2$ a='a.a.a'
bash-3.2$ echo "${a/./ }"
a a.a
bash-3.2$ echo "${a//./ }"
a a a

9

Internal Field Separator (IFS)পরিবর্তনশীল ব্যবহার :

bash-4.3$ old_ifs=$IFS
bash-4.3$ IFS="."
bash-4.3$ var="foo.foo.foo"
bash-4.3$ echo $var
foo foo foo
bash-4.3$ IFS=$old_ifs

এটি একটি ফাংশনে সুন্দরভাবে রাখা যেতে পারে:

split_dot()
{

    string="$1"

    if set | grep -q "IFS";
    then
       ifs_unset="false"
       old_ifs=$IFS
    else
       ifs_unset="true"
    fi

    IFS="."
    echo $string
    if [ "$ifs_unset" == "true" ];
    then
       unset IFS
    else
       IFS=$old_ifs
    fi
}

এবং এটি হিসাবে চালান:

bash-4.3$ split_dot "foo.baz.bar"                                                                             
foo baz bar

3
পুনরায় সেট IFSকরা একটি ভেরিয়েবলে সংরক্ষণ করে মান পুনরুদ্ধার করার চেয়ে আরও জটিল। একটি আনসেট IFSএবং একটি খালি IFSআলাদা আচরণ করে, তাই এটি আগে খালি ছিল কিনা তা আপনার খালি সেট করা আছে কিনা তা খালি খালি করা উচিত।
মুড়ু

5
ফাংশনগুলি সাব-শেলগুলিতে চলবে না। কেবলমাত্র কিছু ভেরিয়েবলের বিভিন্ন স্কোপ থাকে (অবস্থানগত প্যারামিটারগুলি এবং gnu.org/software/bash/manual/html_node/Shell-Funitions.html এ তালিকাভুক্ত কয়েকটি অন্যান্য )। সে কারণেই আমাদের localকীওয়ার্ড রয়েছে।
مورু

3
সুতরাং যদি ওপি এর IFSআগে কোনও কারণে আনসেট করা থাকে তবে এই ফাংশনটি এটিকে খালি করে দেয়, যার আলাদা আচরণ রয়েছে।
মুড়ু

2
@ ফেডরকিই দুর্ভাগ্যক্রমে এমনকি এটি কাজ করবে না; যেহেতু আইএফএসের মানটি বর্তমান বিবৃতিটি বিশ্লেষণের জন্য খুব দেরিতে সেট করা আছে। আপনাকে আসলে একটি সাব-শেল ব্যবহার করতে হবে (IFS=.; echo ...)। যেহেতু এই উত্তরটি একটি ফাংশন ব্যবহার করা হয়, Serg শুধু প্রথম বন্ধনী থেকে ধনুর্বন্ধনী পরিবর্তন হতে পারে এবং এ সব IFS রিসেট সম্পর্কে চিন্তা করবেন
muru

2
@ ফেডরকিই আপনি আমার অনুরূপ প্রশ্নটি উত্তর ও উত্তরটিকে আকর্ষণীয় মনে করতে পারেন: unix.stackexchange.com/q/264635/70524 (গিলস সবসময় খুব ভাল উত্তর দেয়)
মুরু

4

যে কেউ মিস করেছেন awk/ perl/ python/ go:


% awk '{gsub(/[.]/, " ", $0); print}' <<<'foo.foo.foo'                      
foo foo foo

% perl -pe 's/\./ /g' <<<'foo.foo.foo'                                      
foo foo foo

% python -c 'import sys; print sys.stdin.read().replace(".", " ")' <<<'foo.foo.foo'
foo foo foo

% cat input.go
package main

import (
    "os"
    "strings"
    "fmt"
)

func main () {
    args := os.Args
    if len(args) != 2 {
        fmt.Println("Not enough arguments")
        return
    }
    out := strings.Replace(args[1], ".", " ", -1)
    fmt.Println(out)
}

% go run input.go 'foo.foo.foo' 
foo foo foo

1

এক xargsএছাড়াও ব্যবহার করতে পারেন । এখানে একটি ওয়ান-লাইনার ব্যবহার করা হচ্ছেxargs

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