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

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

我想编辑bl:ab:la:bl:ab:la格式为 >>的 MAC 列表blab.labl.abla。每个 MAC 占一行。我是 AWK 或 SED 的新手,但我几乎确信可以使用其中任何命令来执行此操作。

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

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

答案1

awk

awk -F: '{print $1$2"."$3$4"."$5$6}'

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

例子:

$ echo "bl:ab:la:bl:ab:la" | awk -F: '{print $1$2"."$3$4"."$5$6}'
blab.labl.abla

它还可以从如下文件中读取数据:

awk -F: '{print $1$2"."$3$4"."$5$6}' file

并就地修改文件(即编辑原始文件)像这样:

gawk -i inplace -F: '{print $1$2"."$3$4"."$5$6}' file

答案2

如果你输入的是实际的 MAC 地址,那么 perl 有一个网络::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

对于任意 ASCII 文本,你可以解包分隔对,然后将它们通过字符串连接在一起:

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

答案3

操作 bash 参数

您可以通过操作 bash 参数来实现此目的,删除冒号,然后在 4 个字符的字符串之间插入点。有关详细信息,请参阅有关“参数扩展”的章节man bash

下面的 shellscript 文件script可以做你想做的事情,

#!/bin/bash

function converter {

 tmp0="$1"
 tmp1=${tmp0//:/}
 #echo "$tmp1"
 tmpstr="${tmp1:0:4}.${tmp1:4:4}.${tmp1:8:4}"
 echo "$tmpstr"
}

#######
# main
#######

if test -s "$1"
then
 while read line
 do
  converter "$line"
 done < "$1"
else
 echo "Usage: ${0##*/} <file-with-list-of-macs>"
fi

例如:我制作了一个小的输入文件macs

ab:cd:ef:gh:ij:kl
12:ab:34:cd:56:ef
qw:er:ty:as:df:gh

并运行以下命令,

$ ./script macs
abcd.efgh.ijkl
12ab.34cd.56ef
qwer.tyas.dfgh

使用 sed 的命令行

您也可以使用sed与上述几乎相同的方法:删除冒号,然后在 4 个字符的字符串后插入点,最后必须删除每行末尾的多余点,

$ < macs sed -e 's/\://g' -e 's/..../&./g' -e 's/\.$//'
abcd.efgh.ijkl
12ab.34cd.56ef
qwer.tyas.dfgh

对于巨大的输入文件,此解决方案的速度sed比 bash shellscript 快得多。

< huge.in sed -e 's/\://g' -e 's/..../&./g' -e 's/\.$//' > huge.out

相关内容