我有一个包含以下数据的文本文件。我想修改第二列,如下所示。第二列中的第一行应该从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
答案 0 :(得分:3)
简单的awk解决方案......
awk '{ print $1" 0x"$2$3$4$5$6$7; }' input.txt
答案 1 :(得分:3)
如果它是一次性的(在平均工作日期间发生了十几次),我喜欢使用Vim的块视觉模式,通常与qq
... q
结合使用快速宏。
这里,假设起点是文件的开头(gg
):
更新以下是使用评论中建议的优化的演示:
0x
w
Cv G I 0x
ESC f
空格 Cv G x
;.
;.
;.
;.
完成工作!
如果您未设置nostartofline
,则可以将G
替换为1000j
或类似内容(在这种情况下我更喜欢^VGw
)。
G
,则使用1000j
而不是nostartofline
你会看到,一旦你掌握了块视觉模式,你就会开始在任何地方使用它。哦,并在工具箱中获取。(和; 和,)以进行快速,通用(运动)重复!
答案 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的另一种可能性:
:'<,'>s/\%V //g
(当您点击冒号时,由于视觉模式而自动插入'<,'>
,并且在模式中,\%V
是零宽度匹配但仅限内部视觉区域)0x
Esc 共计23次击键。