(我输入了我执行的确切文本和命令,所以看起来有点乱。)
我有一个 .TXT 文件看起来像
11111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
我正在寻找的结果会像
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
Run Code Online (Sandbox Code Playgroud)
我试过的命令是
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
Run Code Online (Sandbox Code Playgroud)
我得到的结果是
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,1111111111111110,111
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,1111111111111110,111
Run Code Online (Sandbox Code Playgroud)
我真的不知道为什么这些 0 突然出现并且“,”没有出现在我命令的位置,即使它工作了一半。
这是错误还是 sed 命令中的某些内容?
anu*_*ava 12
它0在输出中打印,因为sed捕获组及其反向引用最多只能有 9 个,并且\10被解释为\1后跟literal 0。
您可以使用以下FIELDWIDTHS功能gnu-awk轻松解决它:
awk -v OFS=, 'BEGIN { FIELDWIDTHS = "14 7 2 1 3 13 1 8 16 3 *" } {$1 = $1} 1' file
Run Code Online (Sandbox Code Playgroud)
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
Run Code Online (Sandbox Code Playgroud)
只是为了学术练习,这里有一个sed使用 2 个替换来解决这个问题的工作:
sed -E 's/(.{14})(.{7})(.{2})(.)(.{3})(.{13})(.)(.{8})(.+)/\1,\2,\3,\4,\5,\6,\7,\8,\9/; s/(.+,.{16})(.{3})(.*)/\1,\2,\3/' file
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)