1

我正在使用 shell 脚本,如果最后一个字符是,我想在行尾添加一个空格:,.-

我试过sed 's/,.-\r\n/,.- \r\n/g' part2.out > part3.out了,但没有用,我错过了什么?

4

3 回答 3

1

这应该工作 -

sed 's/\([\.,-]\)$/\1 /g' input_file

测试:cat -vet将向您显示特殊的非打印字符

$ cat -vet ff
col1a col2a col3a col4a col5a col6a XXXXXXAAAAA col8a ...$
col1b col2b col3b col4b col5b col6b XXXXXXBBBBB col8b ..-$
col1c col2c col3c col4c col5c col6c XXXXXXCCCCC col8c ..,$
col1d col2d col3d col4d col5d col6d XXXXXXDDDDD col8d ...$

$ sed 's/\([\.,-]\)$/\1 /g' ff | cat -vet
col1a col2a col3a col4a col5a col6a XXXXXXAAAAA col8a ... $
col1b col2b col3b col4b col5b col6b XXXXXXBBBBB col8b ..- $
col1c col2c col3c col4c col5c col6c XXXXXXCCCCC col8c .., $
col1d col2d col3d col4d col5d col6d XXXXXXDDDDD col8d ... $
于 2013-05-30T14:19:00.003 回答
1

如果你有CR+LF行尾,你可以尝试:

sed '/[.,-]\r/ {s/\r/ A/}'

(使用$而不是\r作为LF换行符)

于 2013-05-30T16:10:52.657 回答
1

用于$匹配行尾,并转义.:

sed 's/,\.-$/,.- /'

您可能也应该使用&,并且您可能更喜欢仅在行匹配时进行替换:

sed '/,\.-$/s//& /'

由于您的行似乎具有 DOS 行尾,您可能希望使用dos2unix或其他更适合的实用程序来处理它们。一种简单(但不可靠)的解决方案是只删除\r字符,因为您几乎可以肯定实际上并不希望它们出现在数据中:

tr -d \\r < part2.out | sed 's/,\.-$/& /' > part3.out

可能已经足够好了。如果 Jaypal 是正确的,并且您尝试匹配以任何字符,,结尾的任何行.,或者-不是以 string 结尾,.-,那么您想要:

sed 's/[,.-]$/& /'
于 2013-05-30T14:04:37.130 回答