
答案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