[已编辑] 我有一个行格式为
的文件codeToError[resources.ErrUndefined] = fmt.Errorf("1000: random string")
我想转换为的:
codeToError[resources.ErrUndefined] = fmt.Errorf("%d: random string", resources.ErrUndefined)
基本上,对于文件中的每一行,我需要将行的一部分复制到文件中同一行的另一位置,并用%d替换RHS上的数字。我显然不想复制粘贴线条。我知道“ sed”或“ awk”可能会有所帮助,但不确定如何。
答案 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)
希望这会有所帮助。