perl 匹配模式并在每个字符后插入此模式,直到行尾

wvyml7n5  于 2023-05-18  发布在  Perl
关注(0)|答案(6)|浏览(218)

我有一个带有标识符的行,然后是一个模式(在我的例子中,是一个分号),然后是一个数字列表:

echo "sp16;111111111111111111111111111111211"

我想在所有数字之间插入一个分号,如(期望的输出):

echo "sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1"

到目前为止,我发现了如何使用sed在所有字符之间插入分号:

sed 's/.\{1\}/&;/g'

但是,它也会在匹配第一个分号之前插入分号,并且在行尾添加分号。

sz81bmfz

sz81bmfz1#

使用Perl的一行程序:

perl -pe 's/^([^;]+;)([0-9]+)/$1 . join ";", split "", $2/e' file
sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1
正则表达式匹配如下:
节点解释
^弦锚的起点
(分组并捕获到\1:
[^;]+任何字符,除了:;(1次或多次(匹配最大可能量))
;;
)结束\1
(分组并捕获到\2:
[0-9]+任何字符:“0”到“9”(1次或多次(匹配最大可能量))
)结束\2
Perl的代码解释
操作员含义
$1捕获组1,如sed中的\1
.连接
join ";",用字符'连接;'下面的名单。。
split "", $2在数字列表中拆分捕获的组$2或\2
e允许Perl的代码/表达式在替换s///的右边部分的修饰符
bxjv4tth

bxjv4tth2#

使用GNU sed

echo "sp16;111111111111111111111111111111211" \
  | sed -E ':a; s/(;[^;])([^;]+)$/\1;\2/; ta'

输出:

sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1

参见:man sedThe Stack Overflow Regular Expressions FAQ

fbcarpbf

fbcarpbf3#

使用任何awk:

$ echo "sp16;111111111111111111111111111111211" |
    awk 'BEGIN{FS=OFS=";"} {gsub(/./,FS"&",$2); sub(FS,"")} 1'
sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1
9o685dep

9o685dep4#

下面是另一个sed命令,适用于任何sed版本:

sed -E -e :a -e 's/([0-9])([0-9]+)$/\1;\2/; ta' file

sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1

下面是一个建议的awk解决方案:

awk -F';' -v OFS= '{gsub(/./, FS "&", $2)} 1' file

sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1
xnifntxz

xnifntxz5#

这可能对你有用(GNU sed):

sed 's/;/\n/;h;s/\B/;/g;H;x;s/\n.*\n/;/' file

分头行动。
用换行符替换第一个分隔符;,并复制。
在每个字内字符之间插入;
将结果附加到原始副本中。
;替换两个引入的换行符之间的所有内容。
如果第一个标识符总是4个字符:

sed 's/./;&/7g' file
h43kikqp

h43kikqp6#

echo "sp16;111111111111111111111111111111211" |
mawk 'gsub(".", ";&", $NF)' OFS= FS=';'
sp16;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;1;1

相关问题