スクリプト/エイリアスを使用して、bash / zshでテキストを「foo.foo.foo」から「foo foo foo」に変更するにはどうすればよいですか?


11

<または>またはを使用できます|。たぶん、grepを使用する必要がありますか?


2
テキストとはどういう意味ですか?ファイルまたはファイル内のテキスト?echo "foo.foo.foo" | sed 's/\./ /g'
ザンナ

1
@KDG i)SEサイトごとに個別のアカウントを作成する必要がありますが、同じ資格情報を使用する場合、アカウントはリンクされます。ii)このサイトは確かにUbuntuのみに限定されていますが、Ubuntuを使用していないという反論の余地のある証拠はここにはありません。
テルドン

回答:


20

関数を作成し、の末尾に追加することができます~/.bashrc、例えば:

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

使用例:

$ nodot foo.foo.foo
foo foo foo

この関数はzshでも使用できます~/.zshrc。代わりに追加してください。


6
@tbodtは、受け入れられた回答を別の現在の回答に完全に置き換えるために変更するだけではありません。
ムル

28

trコマンドを使用して文字を変換できます。

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

ヒントは前に「TR」を聞くことはありませんクール
KDG

6
tr実際にはまさにこの目的のためのものです。sedやり過ぎです。
マックスリード

1
+1に対して正確に+1しますtr。これは、多くの人が何らかの理由で知らないように見える非常に便利なツールです。sed文字のクラス全体を変換するよりもずっと簡単です。
ふわふわ

5
「awk」で実行できる場合は、決して「C」で記述しないでください。「sed」で処理できる場合は、「awk」で実行しないでください。「tr」がジョブを実行できる場合は、「sed」を使用しないでください。「cat」で十分な場合は「tr」を呼び出さないでください。可能な限り「cat」の使用は避けてください。
ロスプレッサー

1
いい答え。この答えは受け入れられるべきです。
サブ

24

純粋なbashの使用:

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-Functions.htmlにリストされています)。それがlocalキーワードを持っている理由です。
ムル

3
したがって、OPがIFS以前に何らかの理由で設定解除されていた場合、この関数はそれを空に設定しますが、これは異なる動作をします。
ムル

2
残念ながら@fedorquiでも機能しません。IFS値の設定が、解析中の現在のステートメントに対して遅すぎるためです。実際にはサブシェルを使用する必要があります(IFS=.; echo ...)。この答えは関数を使用したため、
Serg

2
@fedorqui U&Lでの私の似たような質問がおもしろいかもしれません:unix.stackexchange.com/q/264635/70524(Gillesは常に非常に良い答えを出します)
-muru

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.