0

我有一个包含以下数据的文本文件。我想按如下方式修改第二列。第二列中的第一行应从更改36 65 fb 5f 1a c10x3665fb5f1ac1如何使用 sed 或 awk 或任何其他简单方法(vim 也许。 )

我希望第一行看起来像

0x5212cb03ca115ac0      0x3665fb5f1ac1

0x5212cb03ca115ac0      36 65 fb 5f 1a c1
0x5212cb03ca115cc0      36 65 fb 5f 1a c7
0x5212cb03ca115ea0      36 65 fb 5f 1a cd
0x5212cb03ca1160c0      36 65 fb 5f 1a d3
0x5212cb03ca1162a0      36 65 fb 5f 1a d9
0x5212cb03ca1164c0      36 65 fb 5f 1a de
0x5212cb03ca1166a0      36 65 fb 5f 1a e4
0x5212cb03ca1168a0      36 65 fb 5f 1a ea
0x5212cb03ca116aa0      36 65 fb 5f 1a f0
0x5212cb03ca116ca0      36 65 fb 5f 1a f6
0x5212cb03ca116ea0      36 65 fb 5f 1a fc
0x5212cb03ca1170a0      36 65 fb 5f 1b 02
0x5212cb03ca117280      36 65 fb 5f 1b 08
0x5212cb03ca117480      36 65 fb 5f 1b 0e
0x5212cb03ca117680      36 65 fb 5f 1b 14
4

8 回答 8

3

简单的awk解决方案...

awk '{ print $1"      0x"$2$3$4$5$6$7; }' input.txt
于 2013-08-26T20:58:12.947 回答
3

如果它是一次性的(在平均工作日发生十几次),我喜欢使用 Vim 的块可视模式,通常与qq...结合使用q来记录快速宏。

在这里,假设起点是文件的开头 ( gg):

更新这是使用评论中建议的优化的演示:

1.插入0x wC-vGI0xEsc

2.删除空格 fSpaceC-vGx;.;.;.;.

步骤动画

任务完成!

如果您没有nostartofline设置,您可以替换G1000j或类似(我更喜欢^VGw 在这种情况下)。

  1. wfSpace
    定位第二列空格
  2. ^v10000j
    在可视模式下突出显示列(如果您已设置,则使用G而不是)1000jnostartofline
  3. x
    算了吧
  4. ;.;.;.;.
    冲洗并重复

你会看到,一旦你掌握了块视觉模式的窍门,你就会开始在任何地方使用它。哦,在您的工具箱中获取.(and ;and ,) 以进行快速、通用的(运动)重复!


于 2013-08-26T20:58:25.757 回答
2

如果你喜欢在 vim 中做:

%s/\s\s\zs\S.*/\='0x'.substitute(submatch(0),'\s',"","g")/

会做这项工作

于 2013-08-26T21:32:43.270 回答
2

有替换:

:%s/\w\zs\s\ze\w//g
:%s/\s\+\zs/0x/

或一起:

:%s/\w\zs\s\ze\w//g|%s/\s\+\zs/0x/
于 2013-08-26T21:12:31.683 回答
1

试试这个 awk:

awk 'NR==1{for(i=2; i<=NF; i++) s=s$i; $0=$1 OFS "0x" s}1' OFS='\t' file
于 2013-08-26T20:58:46.663 回答
1

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

sed 's/\s/&0x/;s/\s//2g' file
于 2013-08-27T05:37:07.180 回答
1

Vim 解决方案

没有什么花哨的,只需捕获六组两个十六进制数字并将它们按您想要的顺序放置。

:%s/\v(\x\x)\s(\x\x)\s(\x\x)\s(\x\x)\s(\x\x)\s(\x\x)$/0x\1\2\3\4\5\6

我把它作为输出

0x5212cb03ca115ac0      0x3665fb5f1ac1
0x5212cb03ca115cc0      0x3665fb5f1ac7
0x5212cb03ca115ea0      0x3665fb5f1acd
0x5212cb03ca1160c0      0x3665fb5f1ad3
0x5212cb03ca1162a0      0x3665fb5f1ad9
0x5212cb03ca1164c0      0x3665fb5f1ade
0x5212cb03ca1166a0      0x3665fb5f1ae4
0x5212cb03ca1168a0      0x3665fb5f1aea
0x5212cb03ca116aa0      0x3665fb5f1af0
0x5212cb03ca116ca0      0x3665fb5f1af6
0x5212cb03ca116ea0      0x3665fb5f1afc
0x5212cb03ca1170a0      0x3665fb5f1b02
0x5212cb03ca117280      0x3665fb5f1b08
0x5212cb03ca117480      0x3665fb5f1b0e
0x5212cb03ca117680      0x3665fb5f1b14

由于您在分隔列中使用制表符而不是空格,因此您可以从文件中删除所有空格。

:%s/ //g

0x在第一个选项卡之后添加

:%s/\t/\t0x

或者一起

:%s/ //g|%s/\t/\t0x
于 2013-08-26T20:49:49.030 回答
1

vim 的另一种可能性:

  • 转到第二列:W
  • 选择所有列:`Ctrl-V G $
  • 删除选择内的空格:(:'<,'>s/\%V //g当您点击冒号时,'<,'>由于视觉模式而自动插入,并且在模式中,\%V是零宽度匹配但仅在视觉区域内)
  • 重新选择:gv
  • 插入 0x:I0xEsc
  • 节省:ZZ

总共 23 次击键。

于 2013-08-27T07:04:19.137 回答