Unix文本处理将同一行中的部分行复制

时间:2019-04-02 22:46:42

标签: unix awk sed

[已编辑] 我有一个行格式为

的文件
codeToError[resources.ErrUndefined] = fmt.Errorf("1000: random string")
我想转换为的

codeToError[resources.ErrUndefined] = fmt.Errorf("%d: random string", resources.ErrUndefined)

基本上,对于文件中的每一行,我需要将行的一部分复制到文件中同一行的另一位置,并用%d替换RHS上的数字。我显然不想复制粘贴线条。我知道“ sed”或“ awk”可能会有所帮助,但不确定如何。

1 个答案:

答案 0 :(得分:1)

假设数字表示为整数(包括负数), 请尝试以下操作:

sed -e 's/-\{0,1\}[0-9]\{1,\}/%d/' -e 's/\([A-Za-z]\{1,\}\[\([A-Za-z]\{1,\}\)\].\{1,\}\)/\1, \2/' file

结果:

A[xyz] = "%d: random string", xyz
A[abcd] = "%d: another random string", abcd
A[bc] = "%d: random", bc
A[bcd] = "%d: random stuff", bcd

恐怕您的预期输出末尾的双引号不一致 行,我已经省略了。 可以轻松调整上面的sed命令以满足您的要求, 或者如果您可以解决所需的输出,我将相应地更新我的答案。

[编辑]

根据更新后的示例,请尝试以下操作:

使用sed

sed -e 's/-\{0,1\}[0-9]\{1,\}/%d/' -e 's/\([A-Za-z]\{1,\}\[\([^]]\{1,\}\)\].\{1,\}\))/\1, \2)/' file

使用gawk

gawk '$0 = gensub("(\\w+\\[([^]]+)][^0-9-]+)-?[0-9]+(.+)\)", "\\1%d\\3, \\2)", 1)' file

使用Perl

perl -pe 's/(\w+\[(.+?)].+?)-?\d+(.+)\)/\1%d\3, \2)/' file

结果:

codeToError[resources.ErrUndefined] = fmt.Errorf("%d: random string", resources.ErrUndefined)

希望这会有所帮助。