使用sed替换句号完全停止后跟空格

时间:2016-09-03 16:02:48

标签: bash sed

我想用csv的标题字段(field2)替换一个句号,后面跟一个空格:

csv示例:

8389383, hello my.friend,839083083,3390903

预期输出:

8389383, hello my. friend,839083083,3390903

我可以使用以下行成功地用空格替换csv中的句号:

sed -r ':b s/^([^,]*,[^,]*)\./\1 /g; t b' csv

但是,我想用一个句号替换句号后跟一个空格。我试过了:

sed -r ':b s/^([^,]*,[^,]*)\./\1. /g; t b' csv

但这会挂起并且不会产生结果。

我可以添加哪些内容以允许此操作?

编辑 - 只是要添加,我想要替换的字段2(标题字段)中可能有多个句号。我也不希望此规则适用于csv中的任何其他字段。

4 个答案:

答案 0 :(得分:5)

awk最适合这类工作

要在第二个字段中替换所有句号

 awk -v FS="," -v OFS="," '{gsub(/\./,". ",$2)}1' file.csv > tmpfile && mv tmpfile file.csv

8389383, hello my. friend,839083083,3390903
8389383, hello my. fri. end,839083083,3390903

答案 1 :(得分:1)

这个怎么样:

sed -i -e 's/^\([^,]*,[^.,]*\)\.\([^,]*\)/\1. \2/' file.csv

修改如果字段中有多个句号,则无法使用sed执行此操作。这是一个perl单行,但是:

perl -i -pe 'sub t {($s)=@_; $s=~s/\./. /g; $s}; s/^[^,]*,\K([^,]*)/t($1)/e;' file.csv

说明:使用s///命令,我们找到第一个字段([^,]*,),我们跳过它(\K),然后我们找到第二个字段(([^,]*) })。对于该字段,我们执行函数t,它执行简单的变电站。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;s/^([^,]*,[^,.]*)\./\1\n/;ta;s/\n/. /g' file

这里的诀窍是将.转换为something else(我赞成换行符,因为它是seds设计所独有的),然后将something else全局更改为{{1} }作为该行的最后一个操作。

另一种方法是复制线条,更换一块并使用您不想更改的副本中的部分重新组合线条:

whatever

答案 3 :(得分:0)

$ cat file.csv 
8389383, hello my.friend, 839083083, 3390903
8389383, hello my.fri.end, 839083083, 3390903

$ perl -i -F, -e '$F[1] =~ s/\./. /g; print join(",",@F)' file.csv 

$ cat file.csv 
8389383, hello my. friend, 839083083, 3390903
8389383, hello my. fri. end, 839083083, 3390903
  • -F,拆分,上的每一行并将其保存在@F数组中。 -F选项也隐式设置-a-n。有关详细信息,请参阅perldoc Command Switches
  • join(",",@F),作为分隔符加入数组。不知道在perl中是否存在使用相同输入分隔符打印修改后的数组的隐式方法