答案1
使用Sed。
请注意,您不会使用 0 个索引位置,而是从 1 开始。因此,我增加了您提供的数字。
另外,您必须从后到前,因为一旦更改第一个,列位置就会发生变化。所以像这样使用 Sed :
sed 's/./&,/6;s/./&,/4;s/./&,/3'
例子:
$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$
- Sed 中的命令
s
用于替换。 - 该模式
.
匹配任何单个字符。 - 替换文本中的
&
表示“匹配的文本”,逗号是字面逗号。 - 最后一个后面的数字标志
/
表示仅在该行的“第 n”个匹配项上执行替换。
如果你想成为真的奇特的是,使用 Bash 大括号扩展来创建 Sed 命令:
$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c
但这只是锦上添花,并且可能会令人困惑,除非您非常了解 Sed 和 Bash。 :)
如果您想从单独的文件中提取职位列表(正如您在问题中实际显示的那样),您可以这样做:
sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
请注意,这是 Bash 特定的,因为它使用非 POSIX 的进程替换语法。另请注意,我已经将其变得非常强大,但实际上并非如此数字位置文件中的(不以 0 开头的)将被丢弃。
检测结果:
$ cat file
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$
答案2
和perl
:
#!/usr/bin/env perl
my @pos;
while (<>)
{ push @pos, 1 + int; }
continue
{ last if eof; }
@pos = sort { $b cmp $a } @pos;
while (<>) {
for my $k (@pos)
{ s/^.{$k}\K/,/; }
print;
}
像这样运行它:
script.pl positions.txt file.txt