如何在行位置插入ascii字符?

RRR*_*CCC 3 command-line text-processing

bl:ab:la:bl:ab:la我想以格式 >>编辑 MAC 列表blab.labl.abla。每个 MAC 都排成一行。我是 AWK 或 SED 的新手,但我几乎确信可以使用这些命令中的任何一个来执行它。

有没有办法设置必须插入字符(点)的列位置(使用 sed 或 awk)才能完成此任务?

我已经阅读了 sed 手册页,但没有得到任何明确的说明。

Raf*_*ffa 7

awk

awk -F: '{print $1$2"."$3$4"."$5$6}'
Run Code Online (Sandbox Code Playgroud)

-F:将设置:为字段分隔符,并将print $1$2"."$3$4"."$5$6打印字段$1$2然后打印 a.等等......其余的内容是不言自明的。

例子:

$ echo "bl:ab:la:bl:ab:la" | awk -F: '{print $1$2"."$3$4"."$5$6}'
blab.labl.abla
Run Code Online (Sandbox Code Playgroud)

它还可以从文件中读取,如下所示:

awk -F: '{print $1$2"."$3$4"."$5$6}' file
Run Code Online (Sandbox Code Playgroud)

并就地修改文件(即编辑原始文件),如下所示:

gawk -i inplace -F: '{print $1$2"."$3$4"."$5$6}' file
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 5

如果您的输入是实际的 MAC 地址,那么 perl 有一个Net::MAC模块(在 Ubuntu 中通过软件包提供libnet-mac-perl):

前任。

$ echo '01:23:45:67:89:AB' | perl -MNet::MAC -lne '
    my $m = Net::MAC->new("bit_group" => 8, "delimiter" => ":", "mac" => $_);
    print $m->convert("bit_group" => 16, "delimiter", ".")
'
0123.4567.89ab
Run Code Online (Sandbox Code Playgroud)

对于任意 ASCII 文本,您可以解压分隔对,然后将它们对重新字符串连接起来:

$ echo 'bl:ab:la:bl:ab:la' | perl -MList::Util=pairmap -nE '
    say join ".", pairmap { $a . $b } unpack("(A2x)*",$_)
'
blab.labl.abla
Run Code Online (Sandbox Code Playgroud)