【问题标题】:Sed remove white spaces between words and semicolonsed 删除单词和分号之间的空格
【发布时间】:2017-11-10 17:47:45
【问题描述】:

在一个目录中,我有几个带有如下符号的文件:

myKey :
mySecondKey :
blabla :

我想去掉分号前的空格,使它们变成:

myKey:
mySecondKey:
blabla:

我试过了:

sed -e 's/([a-z]*) :/\1:/g' .

但我得到了:

": \1 not defined in the RE

我也试过了:

sed -e 's/([a-z]*)\ \:/\1\:/g'

但是错误并没有改变。

知道我做错了什么吗?

正则表达式如何不正确?

我没有正确定义变量吗?

【问题讨论】:

  • 如果不使用扩展正则表达式选项-r,则需要对组括号进行转义,将's/([a-z]*) :/\1:/g'更改为's/\([a-z]*\) :/\1:/g'

标签: regex sed


【解决方案1】:

为什么不简单:

sed -e 's/ :/:/g'

使用不区分大小写:

sed -e 's/([a-z]*) :/\1:/ig'

sed -e 's/([a-zA-Z]*) :/\1:/g'

【讨论】:

  • 这点很好,但是文件很长,我怕毁了其他组件。
【解决方案2】:

你有小写和大写字符,所以你需要将你的字符类定义为:

sed -E 's/^([a-zA-Z]+)\ :/\1:/g'
#               -^-

另外使用锚点(这里是^),这会产生给定示例:

myKey:
mySecondKey:
blabla:

【讨论】:

    【解决方案3】:

    您可以通过查找单词(例如“myKey”)和:之间的所有空格(\s*)来删除空格并将其替换为:

    sed -i 's/\s*:/:/g' .
    

    【讨论】: