文件就地替换,无需 awk 或 sed



我有一个文件,我会在其中用"X"替换位置 100-119 之间的任何内容,并且我们的 Linux 系统 awk 或 sed 不支持 -i(就地)替换。您能否帮助运行一个命令,该命令将有助于替换以" D"开头的记录

将这个 Perl 单行代码与substr一起使用:

perl -i.bak -pe 'substr( $_, (100 - 1), (119 - 100 + 1) ) = "X"' file1 file2 ...
Perl 单行代码使用以下命令行标志:>-e:告诉 Perl 在内联中查找代码,而不是在 file.
-p:一次循环一行输入,默认情况下将其分配给$_。在每次循环迭代后添加print $_.
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过将扩展名.bak附加到原始文件的名称来保存原始文件的备份副本。

substr( $_, (100 - 1), (119 - 100 + 1) ) = "X":取输入行$_,并将位置 100 和 119 之间的内容替换为X。请注意,substr索引以 0 开头的仓位,因此此处使用100 - 1假设您的仓位编号从 1 开始。

另请参阅:
perldoc perlrun: 如何执行 Perl 解释器: 命令行开关

所有具有"就地编辑"选项(awk、sed、perl、ruby 等)的命令cmd都是在幕后执行的:

tmp=$(mktemp) && cmd 'script' "$file" > "$tmp" && mv -- "$tmp" "$file"

所以你总是可以自己写的。

对于任何给定的命令cmd(即sedawkcuttailgrep或其他任何内容)下面介绍了如何创建和调用"就地编辑"版本,该版本的工作方式就像具有用于多个输入文件的"就地编辑"选项的-i类型的工具一样:

cmd_inplace() {
local tmp file
tmp=$(mktemp) &&
for file; do
cmd 'script' "$file" > "$tmp" &&
mv -- "$tmp" "$file"
done
}
cmd_inplace master_file_*

只需将cmd替换为要调用的任何命令的名称,并cmd 'script'为您想要它执行的任何操作。

相关内容

  • 没有找到相关文章

最新更新