问题描述
(我输入了准确的文本和执行的命令,因此看起来有些混乱。)
我有一个看起来像.TXT的文件
11111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111
我想要的结果会是
11111111111111,1111111,11,1,111,1111111111111,11111111,1111111111111111,111
11111111111111,111
我尝试过的命令是
sed -i 's/\(.\{14\}\)\(.\{7\}\)\(.\{2\}\)\(.\{1\}\)\(.\{3\}\)\(.\{13\}\)\(.\{1\}\)\(.\{8\}\)\(.\{16\}\)\(.\{3\}\)/\1,\2,\3,\4,\5,\6,\7,\8,\9,\10,/' SOME.TXT
我得到的结果是
11111111111111,1111111111111110,111
我真的不知道为什么这些0突然弹出,并且即使在中途工作时,','也不会出现在我命令的位置。
这是bug还是sed命令中的某些东西?
解决方法
它正在输出0
,因为sed
捕获组及其后向引用最多只能有9个,并且\10
被解释为\1
,后跟文字{ {1}}。
您可以使用https://leanpub.com/effectivekotlin轻松解决它:
0
awk -v OFS=,'BEGIN { FIELDWIDTHS = "14 7 2 1 3 13 1 8 16 3 *" } {$1 = $1} 1' file
仅出于学术练习,这里有一个工作的11111111111111,1111111,11,1,111,1111111111111,11111111,1111111111111111,111
11111111111111,111
使用2种替代方法来解决此问题:
sed
,
sed无法引用捕获组> 9,Perl可以:
perl -i -pe 's/(.{14})(.{7})(.{2})(.)(.{3})(.{13})(.)(.{8})(.{16})(.{3})/$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,/' SOME.TXT
,
如果您坚持使用sed
,则可以执行以下操作:
sed 's/./&,/68;s/./&,/65;s/./&,/49;s/./&,/41;s/./&,/40;s/./&,/27;s/./&,/24;s/./&,/23;s/./&,/21;s/./&,/14' test.txt
11111111111111,111