1

我正在开发一个项目,该项目采用以下形式的分隔数据集:

field1~field2~field3~.....~fieldn

有空字段是可能的,所以

field1~~~field4~~field6

完全可以接受。

这个文件是使用内部翻译程序翻译的,这有点不足之处。具体来说,它不能很好地处理空字段。我的解决方案是在其中粘贴一些虚拟值,例如空格或 @ 符号。我试过了:

sed -r 's/~/~ ~/g'

awk '{gsub(/\~\~/,"~ ~")}; 1' file > file.SPACE

但是这两个都不足以替换 MULTIPLE 字段。所以如果我输入

field1~field2~~~field3

它会输出:

field1~field2~ ~~field3

如果可以的话,我只想编写脚本,因为我无法更改翻译器的代码。我可以更改创建分隔文件的程序中的代码,但我不想这样做。是否有一些解决方法,或者正在为此提出一个表达式,这只是常规语言的固有限制之一?

编辑:哇,感谢大家的快速响应,您的所有解决方案都有效,所以我对所有解决方案都投了赞成票。我想我会接受 Janito 的解释。

还有为什么要投反对票?

4

4 回答 4

4

你可以试试:

sed -e ':a;s/~~/~ ~/;ta'

这将使用“:”命令创建一个标签“a”,然后用 替换一次,如果前一个~~替换~ ~命令成功,则使用“t”测试命令跳回“a”标签。

希望这会有所帮助=)

于 2012-10-04T18:02:15.803 回答
3
awk '{for( i=0; i<=NF; i++ ) if( $i ~ /^$/ ) $i = " " } 1' FS='~' OFS='~' input

或者:

awk '/^$/{ $0 = " " } 1' ORS='~' RS='~' input

或者:

awk '{ while( gsub( "~~", "~ ~" )); }1' input
于 2012-10-04T18:03:10.090 回答
1
sed -e ':loop' -e 's/~~/~ ~/g' -e 't loop' file
于 2012-10-04T18:03:44.980 回答
1

你可以使用 Perl

perl -pe 's/~(?=~)/~ /g'

...这表示替换每个"~"后跟"~""~ "


存储要file.SPACE 使用的结果

perl -pe 's/~(?=~)/~ /g' file >file.SPACE
于 2012-10-04T18:04:46.390 回答