如何使用sed用空字符串替换第一个空格

时间:2014-01-07 22:50:19

标签: regex linux bash sed tr

我在将空格分隔的文本文件加载到表中时遇到问题。此文本文件中的数据由teragen生成,因此只是虚拟数据,其中只有2列,第一列具有随机特殊字符串的值。

示例:

~~~{ZRGHS|

~~~{qahVN)

我遇到了一个问题并被拒绝了行,因为其中一些值中有一个空格作为随机ASCII字符,这使得它认为有3列,当我的表有2时,所以它们被拒绝了。

所以,我想要做的只是从这些被拒绝的行中删除第一个空格,这些行需要在每一行上重复多次,然后尝试重新加载它们。那将是最好的解决方法,还是像tr这样的东西会更合适?

谢谢!

3 个答案:

答案 0 :(得分:5)

根据我的理解,你想删除除最后两个之外的所有空格。

  • 您可以为此构建一个正则表达式,或者您可以使用以下事实:首先发生

    $ echo 'one two three four' | rev | sed 's/ //2g' | rev
    onetwothree four
    

    或者,使用文件:

    rev myfile | sed 's/ //2g' | rev
    
  • 或者您可以删除一个空格,直到只剩下一个空格:

    $ echo 'one two three four' | sed ':a;/ .* /{s/ //;ba}'
    onetwothree four
    

    带文件:

    sed ':a;/ .* /{s/ //;ba}' myfile
    
  • 或者,如果你心情愉快,你可以分割线,玩它,然后再组装(GNU sed假设):

     $ echo 'one two three four' | sed -r 's/(.*)([^ ]+) ([^ ]+)$/\1\n\2 \3/;h;s/\n.*//;s/ //g;G;s/\n.*\n//'
    onetwothree four
    

    带文件:

    sed -r 's/(.*)([^ ]+) ([^ ]+)$/\1\n\2 \3/;h;s/\n.*//;s/ //g;G;s/\n.*\n//' myfile
    

答案 1 :(得分:3)

要从一行中删除第一个空格,请使用

echo "my line with spaces" | sed 's/ //'

根据您的方法的具体情况(固定列长度?您如何添加数据?),可能有更好的方法在一步中执行此操作,而不是一遍又一遍地解析被拒绝的行。

答案 2 :(得分:0)

从字符串中删除/删除第一个字符:

function stringStripStart { echo ${1:1:${#1}} }

与删除traling字符类似:

function stringStripEnd { FINAL_LEN=${#1}-1 echo ${1:0:$FINAL_LEN} }

注意:对于空字符串,需要添加一些额外的条件。