如果且仅字段仅包含连字符,则Sed / Awk替换连字符

时间:2015-07-24 09:09:36

标签: awk sed

我想知道如何用BAD替换连字符,当且仅当字段仅包含连字符时,请帮助

输入

$ cat file
90,12,15-NOV-2007,12,1,-,-,23
90,12,06-JAN-2008,12,-,52,27.46,-

输出 - 我尝试了什么

$ sed 's/-/BAD/g' file
90,12,15BADNOVBAD2007,12,1,BAD,BAD,23
90,12,06BADJANBAD2008,12,BAD,52,27.46,BAD

$ awk 'gsub(/-/,"BAD")' file
90,12,15BADNOVBAD2007,12,1,BAD,BAD,23
90,12,06BADJANBAD2008,12,BAD,52,27.46,BAD

预期输出

90,12,15-NOV-2007,12,1,BAD,BAD,23
90,12,06-JAN-2008,12,BAD,52,27.46,BAD

1 个答案:

答案 0 :(得分:1)

使用捕获组。

sed 's/\(^\|,\)-\(,\|$\)/\1Bad\2/g' file

在perl中,

perl -pe 's/(?:,|^)\K-(?=,|$)/BAD/g' file

(?:,|^)非捕获组,它匹配逗号或行边界的起点。 \K取消所有先前匹配的字符。 -仅在连字符后跟逗号或行边界的ed时匹配连字符。

通过awk

 awk -F',' -v OFS="," '{for(i=0;i<=NF;i++){if($i=="-"){$i="BAD"}}}1'

DEMO