如何替换逗号分隔文件中第3列/字段中的第6个字符?

时间:2015-09-01 10:16:23

标签: regex awk sed

假设文件包含以下内容:

Peter,HongKong,000001HongKong,000001,20150901
Mary,London,000001London,000001,20150901

现在我要替换,例如第3列/字段中的第6个字符为2。

s.t:

Peter,HongKong,000002HongKong,000001,20150901
Mary,London,000002London,000001,20150901

如何将此传递给awk / sed?

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

一个尴尬的awk单行:

awk -F, -v OFS="," '$3=substr($3,1,5)"2"substr($3,7)' file

IMO,awk比列分隔数据更适合sed。例如,如果你的要求是改变第45列中的内容,那么sed可以做到,但不像awk那么简单。

答案 1 :(得分:0)

我喜欢这种运动:

击:

#                             v   v
sed -E 's/^([^,]*,[^,]*,.....)./\12/' <<.e
Peter,HongKong,000001HongKong,000001,20150901
Mary,London,000001London,000001,20150901
.e

结果:

Peter,HongKong,000002HongKong,000001,20150901
Mary,London,000002London,000001,20150901

第一个“v”标记您要搜索的内容,第二个“v”标记替换

假设:

  • 字段不包含“,”
  • 你总是用2代替,无论那里有什么
  • 可以654321HongKong
  • 替换654322HongKong

答案 2 :(得分:0)

你有一个很好的awk答案,比较这里的perl替代方案,这更简单,因为perl支持substr作为左值:

perl -F, -ane 'substr($F[2], 5, 1) = "2"; print join ",", @F'

输出:

Peter,HongKong,000002HongKong,000001,20150901
Mary,London,000002London,000001,20150901

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^(([^,]*,){2}[^,]{5})[^,]/\12/' file

或者:

sed 's/^\(\([^,]*,\)\{2\}[^,]\{5\}\)[^,]/\12/' file

或其他方式:

sed 's/[^,]*/\n&/3;s/\n\([^,]\{5\}\)[^,]/\12/' file