通过删除空格来改变模式?

通过删除空格来改变模式?

文件 :

hi hello,new york,      ,  ,brazil site   ,brazil
january,month is feb   ,      , ,indiana jones

任务:

  • 如果除空格之外没有其他字符,则删除任意两个逗号(如 , ,)之间的所有水平空格(空格和制表符)。所以它看起来像:

    hi hello,new york,,,brazil site   ,brazil
    january,month is feb   ,,,indiana jones
    
  • 另外,删除每个参数的任何尾随或前导水平空格(空格和制表符),使其看起来像这样。

    最终输出:

    hi hello,new york,,,brazil site,brazil
    january,month is feb,,,indiana jones
    

注意:参数本身有空格,如hi helloandindiana jones等,不应该受到影响而变成hihello或 之类的indianajones。如果可能的话用 awk 解决,否则 sed 也可以。

我无法像这样使用 sed 完成第一个任务:

sed -n 's/,[[:blank:]],/,,/gp' file

但我得到这个作为输出:

january,month is feb   ,      ,,indiana jones

答案1

所以,你在问 awk:

awk '{$1=$1};gsub(" ,",",")'

这行吗?请注意,这会产生删除数据中逗号内重复空格的副作用,这对于英语来说可能不是问题。

答案2

sed 有三种可能性:

  1. g最简单的一个(在逗号之前匹配空格字符零次或多次,在逗号之后匹配空格字符零次或多次,仅用逗号替换它 - 如此多次,因此使用选项全球的):

    sed 's/ *, */,/g' file
    

    该命令的执行时间:3.056s,而perl -p -e不是sed5.932s

  2. [:space:]表示所有空白字符,因此与 相同[ \t\r\n\v\f]这是 POSIX 标准:

    sed 's/[[:space:]]*,[[:space:]]*/,/g' file
    

    该命令的执行时间:10.365s,而perl -p -e不是sed9.060s

  3. 最后是带有 的缩写版本,它的意思与but\s相同[:space:]Perl语法:

    sed 's/\s*,\s*/,/g' file
    

    该命令的执行时间:10.507s,而perl -p -e不是sed6.126s

所有这些都会导致

hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones

时间被当作​​一个有 2M 行的文件(包含 1M 次问题示例文本)。该文件有 97MBytes 大。

第一个命令似乎是最快的sed。最后一个命令在使用 perl 时是最快的,并且考虑到它不仅替换空格,还替换制表位、换行符等。

相关内容