我有一个连续5个点的标题,我想用bash脚本只用一个空格替换它。这样做没有帮助:
tr '.....' ' '
显然是因为它用五个空格代替五个点。
基本上,我有一个标题,我想改成一个slu ..所以我正在使用:
tr A-Z a-z | tr '[:punct:] [:blank:]' '-'
将所有内容更改为小写并将所有标点符号和空格更改为连字符,但我仍然坚持使用这些点。
我正在使用的标题是:Believe.....Right Now
所以我希望它变成believe-right-now
如何将5个点更改为单个空格?
答案 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