我想用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中的任何其他字段。
答案 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中是否存在使用相同输入分隔符打印修改后的数组的隐式方法