从文本文件中删除数字之间的空格

时间:2013-08-26 20:44:42

标签: vim sed awk

我有一个包含以下数据的文本文件。我想修改第二列,如下所示。第二列中的第一行应该从36 65 fb 5f 1a c1更改为0x3665fb5f1ac1我该怎么做使用sed或awk或任何其他简单的方法(vim may。)

我希望第一行看起来像

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

8 个答案:

答案 0 :(得分:3)

简单的awk解决方案......

awk '{ print $1"      0x"$2$3$4$5$6$7; }' input.txt

答案 1 :(得分:3)

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

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

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

1。插入0x w Cv G I 0x ESC

2。删除空格 f 空格 Cv G x ;. ;. ;. ;.

animation of the steps

完成工作!

如果您未设置nostartofline,则可以将G替换为1000j或类似内容(在这种情况下我更喜欢^VGw)。

  1. 瓦特 ˚F 空间
    找到第二列空格
  2. ^ V 10000J
    以可视模式突出显示列(如果设置了G,则使用1000j而不是nostartofline
  3. X
    drop it
  4. ; ; ; ;
    rinse&重复
  5. 你会看到,一旦你掌握了块视觉模式,你就会开始在任何地方使用它。哦,并在工具箱中获取(和; )以进行快速,通用(运动)重复!


答案 2 :(得分:2)

替换:

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

或全部:

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

答案 3 :(得分:2)

如果你喜欢在vim中这样做:

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

将完成这项工作

答案 4 :(得分: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

答案 5 :(得分:1)

试试这个awk:

awk 'NR==1{for(i=2; i<=NF; i++) s=s$i; $0=$1 OFS "0x" s}1' OFS='\t' file

答案 6 :(得分:1)

这可能适合你(GNU sed):

sed 's/\s/&0x/;s/\s//2g' file

答案 7 :(得分:1)

vim的另一种可能性:

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

共计23次击键。