【问题标题】:Bash regexp: How to replace all non-whitespace characters with a letter?Bash regex:如何用字母替换所有非空白字符?
【发布时间】:2016-02-20 07:20:54
【问题描述】:

我有一个包含大量空格和一些其他 ASCII 字符的文本文件。我想使用 Bash(最好通过 sed)将文件中的任何非空白字符替换为字母 M。我该怎么做呢?

感谢您的帮助。

编辑:对于反对者,我尝试运行:

sed -i 's/[^\s]/M/g' file

还有这个:

sed -i 's/[^\s]/M/' file

但他们都没有做得很好。我对正则表达式有点不熟悉,所以如果我做的事情明显错误,请道歉。

【问题讨论】:

  • 我有理由确定 \s 是 Perl 的东西,而在 Perl 中,你会使用 \S 而不是 [^\s] 来匹配非空白字符。

标签: regex linux bash shell sed


【解决方案1】:

您可以使用 POSIX 字符类:

sed -i 's/[^[:space:]]/M/g' file

例如:

$ echo 'a b       c' | od -a                  
0000000   a  sp   b  sp  ht   c  nl
0000007
$ echo 'a b       c' | sed 's/[^[:space:]]/M/g' | od -a
0000000   M  sp   M  sp  ht   M  nl
0000007

注意:

  • s 命令的 g 标志,因为您想替换一行中的所有匹配项

【讨论】:

  • 穆鲁,感谢您的帮助!但是,问题是 -空白字符。
  • OP 要求输入 非空白 字符。应该使用与 [[:space:]] 相对的字符类。
  • @RanyAlbegWein ...这是[^[:space:]]
【解决方案2】:

使用 tr

tr -c '[:space:]' M < file

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2012-09-04
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多