bash 脚本在 y 出现时找到计数高于 x 的行,然后用 z 替换某个点之后的任何内容

Posted

技术标签:

【中文标题】bash 脚本在 y 出现时找到计数高于 x 的行,然后用 z 替换某个点之后的任何内容【英文标题】:bash scripting find a line that has a count higher than x for y occurance and then replace anything after a certain point with z 【发布时间】:2017-01-02 15:25:08 【问题描述】:

我正在尝试做的示例

(注意:编号不是实际代码的一部分。)


cat program.nasm

1. "\x61\x6e\x69\x6e\x67\x2c\x20\x74\x68\x65"
2. "\x20\x6f\x6e\x6c\x79\x20\x70\x61\x72\x74"
3. "\x20\x74\x68\x61\x74\x20\x6d\x65\x61\x6e"
4. "\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x20\x69\x73\x20\x77\x68\x61"
5. "\x74\x20\x69\x73\x20\x63\x6f\x6e\x74\x61\x69\x6e\x65\x64\x20\x69"
6. "\x6e\x20\x74\x68\x65\x20\x73\x74\x61\x63\x6b\x20\x6f\x76\x65\x72\xf2"
7. "\x66\x6c\x6f\x77\x20\x71\x75\x65\x73\x74\x69\x6f\x6e"
8. this is random characters that is longer than line 6 to make things
challenging

前 3 行有 10 个字节 第 4 行和第 5 行各 16 个字节 第 6 行超过 16 个字节 第 7 行可能多达 16 个字节,也可能更少 第 8 行字符集很长

简而言之,我需要的东西会

第一次搜索“\x”超过 16 次的行 第二次删除该点之后的所有内容(字符数 = 16 * 4 + 1 = 65) 第三次在末尾加引号。

这就是我想要的样子 注意第 6 行,它是唯一不同的行

cat program.nasm

1. "\x61\x6e\x69\x6e\x67\x2c\x20\x74\x68\x65"
2. "\x20\x6f\x6e\x6c\x79\x20\x70\x61\x72\x74"
3. "\x20\x74\x68\x61\x74\x20\x6d\x65\x61\x6e"
4. "\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x20\x69\x73\x20\x77\x68\x61"
5. "\x74\x20\x69\x73\x20\x63\x6f\x6e\x74\x61\x69\x6e\x65\x64\x20\x69"
6. "\x6e\x20\x74\x68\x65\x20\x73\x74\x61\x63\x6b\x20\x6f\x76\x65\x72"
7. "\x66\x6c\x6f\x77\x20\x71\x75\x65\x73\x74\x69\x6f\x6e"
8. this is random characters that is longer than line 6 to make things
challenging

【问题讨论】:

出于好奇,你想用这个做什么? :) 使用 shell 脚本修改二进制文件听起来绝对是个糟糕的主意。 请edit您的问题显示what you have tried so far。您应该包含您遇到问题的代码的minimal reproducible example,然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask。 【参考方案1】:

sed oneliner -

sed -r 's/^("(\\x[0-9a-f][0-9a-f])16).*/\1"/'

【讨论】:

欢迎来到 Stack Overflow!尽管此代码可能有助于解决问题,但它并没有解释 why 和/或 如何 回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。【参考方案2】:
$ awk '$0 ~ /(\\x[0-9a-f]2)17/ $0=substr($0,1,65)"\""; print' foo
"\x61\x6e\x69\x6e\x67\x2c\x20\x74\x68\x65"
"\x20\x6f\x6e\x6c\x79\x20\x70\x61\x72\x74"
"\x20\x74\x68\x61\x74\x20\x6d\x65\x61\x6e"
"\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x20\x69\x73\x20\x77\x68\x61"
"\x74\x20\x69\x73\x20\x63\x6f\x6e\x74\x61\x69\x6e\x65\x64\x20\x69"
"\x6e\x20\x74\x68\x65\x20\x73\x74\x61\x63\x6b\x20\x6f\x76\x65\x72"
"\x66\x6c\x6f\x77\x20\x71\x75\x65\x73\x74\x69\x6f\x6e"
this is random characters that is longer than line 6 to make things challenging

它的作用:

第一次搜索“\x”超过 16 次的行 第二次删除该点之后的所有内容(字符数 = 16 * 4 + 1 = 65) 3rd 在末尾添加引号 第四次打印

【讨论】:

虽然此代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。

以上是关于bash 脚本在 y 出现时找到计数高于 x 的行,然后用 z 替换某个点之后的任何内容的主要内容,如果未能解决你的问题,请参考以下文章

确定字符串“a”在“x”小时内是不是相同然后执行“Y”的 Bash 脚本

是否可以在 Bash 脚本的 switch case 中结合两个条件?

Bash 脚本错误:“函数:未找到”。为啥会出现这种情况?

如何在使用“融化”分组的seaborn计数图上获得高于柱的值

绘制象限图以根据 X 和 Y 的平均值区分 4 组中的人口并找到最终计数

在bash脚本中查找包含所有关键字的行