Bir komut dosyası / takma ad ile bash / zsh komutunun bazı metinleri “foo.foo.foo” dan “foo foo foo” ya değiştirmesini nasıl sağlayabilirim?


11

Belki kullanabilir <veya >veya |. Belki grep kullanmalıyım?


2
Bir metinle ne demek istiyorsun? dosya veya dosyadaki bir metin? echo "foo.foo.foo" | sed 's/\./ /g'
Zanna

1
@KDG i) her bir SE sitesi için ayrı bir hesap oluşturmanız gerekir, ancak aynı kimlik bilgilerini kullanırsanız, hesaplar bağlanır. ii) Bu site gerçekten sadece Ubuntu ile sınırlı olsa da, burada Ubuntu kullanmadığınızın reddedilemez kanıtı olabilecek hiçbir şey görmüyorum, bu yüzden de kapatmak için bir neden göremiyorum.
terdon

Yanıtlar:


20

Bir işlev yapabilir ve cihazınızın sonuna ekleyebilirsiniz ~/.bashrc, örneğin:

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

kullanım örneği:

$ nodot foo.foo.foo
foo foo foo

Bu işlevi zsh içinde de kullanabilirsiniz, ~/.zshrcbunun yerine sadece ekleyin .


6
@tbodt, kabul edilen bir cevabı tamamen başka bir geçerli cevapla değiştirmek için değiştirmek basitçe yapılmaz.
muru

28

Karakter dönüştürmek için tr komutunu kullanabilirsiniz .

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

serin ipuçları daha önce hiç "tr" duymak
KDG

6
traslında bu amaç içindir. sedaşırı dolu.
Max Ried

1
Tam olarak + 1'leyin tr, bu da birçok insanın bir nedenden dolayı bilmediği çok kullanışlı bir araçtır. sedTüm karakter sınıflarını dönüştürmekten çok daha basit .
kabarık

5
Eğer 'awk' ile yapabiliyorsanız asla 'C' yazmayın; 'Sed' üstesinden gelebiliyorsa asla 'awk' içinde yapmayın; 'Tr' işi yapabiliyorken asla 'sed' kullanmayın; 'Kedi' yeterli olduğunda asla 'tr' çağırma; Mümkün olduğunca 'kedi' kullanmaktan kaçının. --Taylor'un Programlama Yasaları
Ross Presser

1
Güzel cevap. Bu cevap kabul edilmelidir.
SuB

24

Saf bash kullanma:

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)Değişken kullanma :

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

Bu bir fonksiyona güzelce konabilir:

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
}

Ve şu şekilde çalıştırın:

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

3
Sıfırlama IFS, yalnızca bir değişkene kaydetmekten ve değeri geri yüklemekten daha zordur. Bir küme IFSve boş bir IFSdavranışın farklı davranışları vardır, bu nedenle daha önce boş olması durumunda ayarlanmamış mı yoksa sadece boş mu olduğunu kontrol etmeniz gerekir.
muru

5
İşlevler alt kabuklarda çalışmaz. Yalnızca bazı değişkenlerin kapsamı farklıdır (konum parametreleri ve gnu.org/software/bash/manual/html_node/Shell-Functions.html içinde listelenen diğer birkaç değişken ). Bu yüzden localanahtar kelimemiz var.
muru

3
Bu nedenle OP daha IFSönce bir nedenden ötürü ayarlanmamış olsaydı, bu işlev onu farklı bir davranışa sahip olan boş olarak ayarlardı.
muru

2
@fedorqui maalesef bu bile çalışmaz; çünkü IFS değeri, yürürlükteki ifade ayrıştırılmak için çok geç olarak ayarlanmış. Aslında bir alt kabuk kullanmanız gerekir (IFS=.; echo ...). Bu yanıt bir işlev kullandığı için Serg, parantezleri parantez olarak değiştirebilir ve IFS'yi sıfırlama konusunda endişelenmeyebilir
muru

2
@fedorqui, U&L ile ilgili benzer sorumu ilginç bulabilirsin: unix.stackexchange.com/q/264635/70524 (Gilles her zaman çok iyi cevaplar verir)
muru

4

Kaçırılan 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

Bir de kullanabilirsiniz xargs. İşte tek katmanlı birxargs

$ echo "foo.foo.foo" | xargs -d .
foo foo foo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.