0070 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 34
0080 2e 30 20 28 63 6f 6d 70 61 74 69 62 6c 65 3b 20
我正试图找到一种找到/匹配模式的方法
2f 34 2e 30 20 28 63 6f
并将其替换为
2f 35 2e 30 20 28 68 63
问题是这种模式可以通过许多不同的方式分成两行,例如2f 34 2e 30 20
可以位于第一行的末尾,然后是下一行的其余模式。我想学习如何找到替代其他(更大)的模式。
此代码仅在模式完全包含在一行中时才有效。
# replace hex equivalent of "/4.0 (co" with "/5.0 (hc" in hex field
sed 's/2f 34 2e 30 20 28 63 6f/2f 35 2e 30 20 28 68 63/g' <MPFADT$var.txt >>MPFADT$new.txt"
我玩过awk和sed,但无济于事。我也查看了perl示例。
我很确定我可以摆脱偏移但是,这需要合并,这会破坏格式化......
awk -F' ' ' {print " "$2 > file} MPFADT$var.txt
答案 0 :(得分:0)
十六进制代码可以通过用于生成十六进制转储的工具使用多行打印,但原始文件中包含的十六进制字符串不会“分解”为多行。我的意思是如果“2f 34 2e 30 20 28 63 6f”在某处包含一个新行...它将是一个不同的十六进制序列。
那就是说,我认为你可以使用sed:
$ sed 's/\x2f\x34\x2e\x30\x20\x28\x63\x6f/\x2f\x35\x2e\x30\x20\x28\x68\x63/' your_file
答案 1 :(得分:0)
这是一种不关心你要替换的字符串有多长或者它分裂了多少行的方法:
$ cat tst.awk
{
keys[NR] = $1
sub(/^[^[:space:]]+[[:space:]]+/,"")
buf = (NR>1 ? buf FS : "") $0
}
END {
gsub(old,new,buf)
for (i=1; i<length(buf); i+=(NF*3)) {
print keys[++nr] " " substr(buf,i,(NF*3)-1)
}
}
$ awk -v old="2f 34 2e 30 20 28 63 6f" -v new="2f 35 2e 30 20 28 68 63" -f tst.awk file
0070 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35
0080 2e 30 20 28 68 63 6d 70 61 74 69 62 6c 65 3b 20
它确实将整个文件读入内存,如果这对您来说是个问题,请发送idk。如果是,您可以将buf
定义为某个最大大小,并编写代码以通过FIFO旋转所有输入行,每次gsub()
更改buf
但更多复杂且效率较低,然后您必须考虑第二个gsub()
可能在第一个gsub()
而不是原始数据修改的数据上运行。
答案 2 :(得分:0)
这是一种方法。首先使用mydt[,.(V2 = mean(V2, na.rm = T), V3 = if("Level 1") "Level 1" else if("idk help me out?")), by = "V1"]
以 plain format 转储文件,这将禁止左侧的地址。现在删除所有换行符,以便没有任何内容可以跨越多行,因为您的文件现在是一个长行,然后进行替换而不受惩罚,并再次使用xxd
进行重建。描述比需要更长的时间!
xxd
你最好使用 GNU sed ,因为它对行长度没有限制。
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed -r 'N;s/2f(\n.... | )34(\n.... | )2e(\n.... | )30(\n.... | )20(\n.... | )28(\n.... | )63(\n.... | )6f/2f\135\22e\330\420\528\668\763/;P;D' file
保持两行和模式匹配的运行窗口。由于模式可能出现在输出中的任何地方,因此可以通过在每对符号之间提供替代模式来实现这一点。
N.B。你的成功可能有限,因为分页可能会让苹果车感到不安。