我有一个文件,我会在其中用"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
(即sed
、awk
、cut
、tail
或grep
或其他任何内容)下面介绍了如何创建和调用"就地编辑"版本,该版本的工作方式就像具有用于多个输入文件的"就地编辑"选项的-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'
为您想要它执行的任何操作。