用一个空格替换5个点

时间:2013-08-12 17:49:32

标签: bash command tr

我有一个连续5个点的标题,我想用bash脚本只用一个空格替换它。这样做没有帮助:

tr '.....' ' ' 

显然是因为它用五个空格代替五个点。

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

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

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

我正在使用的标题是:Believe.....Right Now

所以我希望它变成believe-right-now

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

3 个答案:

答案 0 :(得分: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版本不支持标记-r,您可以使用:

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

答案 1 :(得分: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以供参考。

答案 2 :(得分:2)

$ cat file
Believe.....Right Now

$ awk '{gsub(/[[:punct:][:space:].]+/,"-"); print tolower($0)}' file
believe-right-now