我有一个包含很长字符串的文件,我想用 Ns 替换它的子字符串。例子:
测试
ABCDABCDABCD
我想用 awk 命令和 sed 用所有字母 N 替换它的子字符串,索引从 5 到 8 的所有字符,所以字母 N 的总长度是 4。
输出
ABCDNNNNABCD
我试过这样的事情:
awk '{ v=substr($0,5,4); sed -i "s/$v/N/g";print substr($0,1,4)""v""substr($0,9,12)}' test
但是,此命令似乎给出了以下输出:
ABCDABCDABC
并且没有替换
我想在代码中包含从哪里开始替换的索引号(例如,这里是 5)和替换的长度号(这里是 4),所以我可以修改这些数字以防万一我想从另一个位置开始并进行不同长度的替换,因为实际上,我有一个包含数千个字母的字符串,我想替换数百个字符,因此在我的情况下替换模式不起作用
使用 GNU awk,您可以做到
或者用 perl
对于这两种解决方案,我们使用命令行选项将开始值和结束值传递给程序。这使得从 shell 脚本中更改值变得容易。如果您还需要使替换字符 N 动态化,那么应该很明显如何。
如果您有 GNU awk (gawk),您可以设置
FIELDWIDTHS
根据字符位置将行拆分为字段。这对于您在 gawk 版本 >= 4.2 中的情况特别方便,它支持“通配符”尾随字段宽度。然后,您可以使用以下方法替换第二个字段中的字符gsub
:在旧版本的 gawk 中,您可以
*
通过为尾随字段选择适当大的最大大小来模拟:看
处理固定宽度数据
捕获可选的尾随数据
使用 sed
要将字符 5 到 8 替换为
N
:这个怎么运作:
(.{4})
捕获组 1 中的前四个字符。.{4}
匹配接下来的四个字符。\1NNNN
用第 1 组和第 4 组替换上述内容N
。使用 GNU awk
这个怎么运作:
-F ""
告诉 awk 将每个字符视为一个单独的字段。for (i=5; i<=8; i++) $i="N"
从 5 到 8 循环遍历每个字符并将其更改为N
.1
告诉 awk 打印该行。您可以通过使用以下方法来做到这一点,如 POSIX 或 GNU seds 所示
使用 sed 编辑器:
使用 Perl:
您可以尝试使用以下命令
输出