如何使用脚本/别名使bash / zsh将某些文本从“ foo.foo.foo”更改为“ foo foo foo”?


11

我可以使用<>|。也许我需要使用grep?


2
文字是什么意思?文件或文件中的某些文本?echo "foo.foo.foo" | sed 's/\./ /g'
Zanna 2016年

1
@KDG i)您需要为每个SE站点创建一个单独的帐户,但是如果您使用相同的凭据,则这些帐户将被链接。ii)虽然此站点确实仅限于Ubuntu,但我在这里看不到任何可以证明您没有使用Ubuntu的可靠证据,因此我也没有理由关闭它。
terdon

Answers:


20

您可以创建一个函数并将其添加到的末尾~/.bashrc,例如:

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

用法示例:

$ nodot foo.foo.foo
foo foo foo

您也可以在zsh中使用此功能,只需添加即可~/.zshrc


6
@tbodt更改接受的答案以将其完全替换为另一个当前答案完全是没有完成的。
muru

28

您可以使用tr命令转换字符。

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

很酷的技巧,之前从未听说过“ tr”
KDG

6
tr实际上就是为了这个目的。sed太过分了。
Max Ried

1
恰好为+1 tr,这是一个非常有用的工具,很多人出于某种原因似乎并不了解。比sed转换整个字符类更简单。
蓬松的

5
如果可以在“ awk”中执行,请不要在“ C”中编写;如果“ sed”可以处理,则永远不要在“ awk”中执行;当“ tr”可以胜任工作时,切勿使用“ sed”;当“ cat”足够时,切勿调用“ tr”;尽可能避免使用“ cat”。-泰勒编程定律
Ross Presser

1
好答案。这个答案应该被接受。
SuB

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
函数不在子shell中运行。只有一些变量具有不同的作用域(位置参数,其他变量在gnu.org/software/bash/manual/html_node/Shell-Functions.html中列出)。这就是为什么我们有local关键字。
muru

3
因此,如果OP之前IFS由于某种原因未设置,则此功能会将其设置为空,这的确具有不同的行为。
muru

2
不幸的是,@ fedorqui甚至行不通;由于IFS值设置得太晚,无法解析当前语句。您实际上必须使用subshel​​l (IFS=.; echo ...)。由于此答案使用了函数,Serg可以将花括号更改为括号,而完全不必担心会重置IFS
muru

2
@fedorqui,您可能会发现我在U&L上遇到的类似问题很有趣:unix.stackexchange.com/q/264635/70524(吉尔斯总是给出很好的答案)
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.