0

我正在使用 gsub 用逗号替换制表符

gsub(/\t/,\",\")

a\tb will be a,b

在某些情况下,我有两个彼此紧随的选项卡例如

a/t/tb 

在这种情况下,gsub 将其转换为a,,b 我想要的,在这种情况下,字符串应转换为 a,-,b (中间的减号)。

我试着写两个单独的 gsub

gsub(/\t/,\",\") // for tab

gsub(/,,/,\"/,-,/\") // for consecutive commas

第二个好像不行。

它出什么问题了。有没有办法,我可以将两者合二为一gsub

4

1 回答 1

1

我认为你在问awk?我不认为它可以用一个 gsub 来完成,事实上我需要三个:

$ abc=$(echo 'a.b..c...d....e.....f' | tr . '\t')

$ echo "$abc" | awk '{gsub(/\t/, ","); gsub(/,,/, ",-,"); gsub(/,,/, ",-,"); print}'
a,b,-,c,-,-,d,-,-,-,e,-,-,-,-,f

问题是单个 gsub on/,,/将消耗两个逗号,因此如果有三个或更多连续的逗号,它将在下一对逗号之间留下间隙。在更强大的正则表达式引擎中,例如 Perl,它可以使用前瞻在单遍中完成:

$ echo "$abc" | perl -pe 's/\t/,/g; s/,(?=,)/,-/g;'
a,b,-,c,-,-,d,-,-,-,e,-,-,-,-,f
于 2013-03-13T23:56:02.500 回答