我想知道如何用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
答案 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'