Как я могу заставить bash/zsh изменять некоторый текст от “foo.foo.foo” до “нечто нечто нечто” со сценарием/псевдонимом?

Я могу, возможно, использовать < или > или |. Возможно, я должен использовать grep?

11
задан 19 November 2016 в 03:16

6 ответов

Можно сделать функцию и добавить в конец Вашего ~/.bashrc, например:

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

пример использования:

$ nodot foo.foo.foo
foo foo foo

можно использовать эту функцию в zsh также, просто добавить к Вашему ~/.zshrc вместо этого.

20
ответ дан 23 November 2019 в 03:49

Можно использовать команда tr для преобразования символа.

% echo "foo.foo.foo" | tr '.' ' ' 
foo foo foo
28
ответ дан 23 November 2019 в 03:49

Используя чистый удар:

bash-3.2$ a='a.a.a'
bash-3.2$ echo "${a/./ }"
a a.a
bash-3.2$ echo "${a//./ }"
a a a
24
ответ дан 23 November 2019 в 03:49

Используя 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
9
ответ дан 23 November 2019 в 03:49

Можно использовать xargs также. Вот острота с помощью xargs

$ echo "foo.foo.foo" | xargs -d .
foo foo foo
1
ответ дан 23 November 2019 в 03:49

Любой отсутствовал 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
4
ответ дан 23 November 2019 в 03:49

Другие вопросы по тегам:

Похожие вопросы: