2

我有一个包含 5 个连续点的标题,我想使用 bash 脚本将其替换为一个空格。这样做没有帮助:

tr '.....' ' ' 

显然是因为它用 5 个空格替换了 5 个点。

基本上,我有一个我想改成 slug 的标题。所以我正在使用:

tr A-Z a-z | tr '[:punct:] [:blank:]' '-'

将所有内容更改为小写并将任何标点符号和空格更改为连字符,但我坚持使用点。

我使用的标题类似于:Believe.....Right Now

所以我想把它变成believe-right-now

如何将 5 个点更改为一个空格?

4

3 回答 3

4

您不需要 sed 或 awk。你原来的 tr 命令应该可以解决问题,你只需要添加 -s 标志。在 tr 将所需字符转换为连字符后, -s 会将所有重复的连字符压缩为一个:

tr A-Z a-z | tr -s '[:punct:] [:blank:]' '-'

我不确定输入/输出上下文对你来说是什么,但我对上面的内容进行了如下测试,它对我有用:

tr A-Z a-z <<< "Believe.....Right Now" | tr -s '[:punct:] [:blank:]' '-'

输出:

相信现在

请参阅http://www.ss64.com/bash/tr.html以供参考。

于 2013-08-12T22:10:14.610 回答
4

音译是通过映射执行的,这意味着每个字符都被映射到其他东西——或删除,使用tr -d. 这就是为什么tr '.....' ' '不起作用的原因。

用空格替换五个点:

  • 使用sed扩展正则表达式:

    $ sed -r 's/\.{5}/ /g' <<< "Believe.....Right Now"
    Believe Right Now
    
  • sed不使用-r

    $ sed 's/\.\{5\}/ /g' <<< "Believe.....Right Now"
    Believe Right Now
    
  • 使用参数扩展:

    $ text="foo.....bar.....zzz" && echo "${text//...../ }"
    foo bar zzz
    

用 替换五个点和空格-

$ sed -r 's/\.{5}| /-/g' <<< "Believe.....Right Now"
Believe-Right-Now

全替换——开沟tr用法:

$ sed -re 's/\.{5}| /-/g' -e 's/([A-Z])/\l&/g' <<< "Believe.....Right Now"
believe-right-now

或者,如果您的sed版本不支持 flag -r,您可以使用:

$ sed -e 's/\.\{5\}\| /-/g' -e 's/\([A-Z]\)/\l&/g' <<< "Believe.....Right Now"
believe-right-now
于 2013-08-12T17:51:22.583 回答
2
$ cat file
Believe.....Right Now

$ awk '{gsub(/[[:punct:][:space:].]+/,"-"); print tolower($0)}' file
believe-right-now
于 2013-08-12T17:55:38.463 回答