【问题标题】:File inplace replacement without awk or sed没有 awk 或 sed 的文件就地替换
【发布时间】:2021-09-14 12:54:52
【问题描述】:

我有一个文件,我想用“X”替换位置 100-119 之间的任何内容,而我们的 Linux 系统 awk 或 sed 不支持 -i(就地)替换。您能否提供替代方法以运行有助于替换以“D”开头的记录的命令

【问题讨论】:

  • 使用awk '...' file > file.tmp && mv file.tmp file
  • 希望对以 master_file_YYYYMMDD 开头的大量文件运行单个命令 - 大约有 9000 个文件需要运行此命令
  • 没关系。甚至 -i inplace 在幕后也是如此。
  • 添加一些样本输入并完成这些样本的预期输出。添加您当前拥有的代码。 perled 是就地编辑的可能选项
  • 您的问题是 a) 如何将脚本写入 replace whatever is between position 100-119 with "X" 或 b) replace record which starts with "D" 或 c) 当您没有直接支持它的 sed 或 awk 时如何进行就地编辑?无论哪种情况,请edit 将您的问题包含在minimal reproducible example 中,其中包含简洁、可测试的示例输入和预期输出,以证明您正在寻求帮助的问题。

标签: linux shell unix awk


【解决方案1】:

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

perl -i.bak -pe 'substr( $_, (100 - 1), (119 - 100 + 1) ) = "X"' file1 file2 ...

Perl 单行代码使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-p:循环输入一行一次,默认分配给$_。在每次循环迭代后添加print $_
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,保存原始文件的备份副本,方法是在其名称后附加扩展名 .bak

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

另请参阅:
perldoc perlrun: how to execute the Perl interpreter: command line switches

【讨论】:

    【解决方案2】:

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

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

    所以你总是可以自己写。

    对于任何给定的命令cmd(即sed,或awk,或cut,或tailgrep,或其他任何命令),这里是您如何创建和调用“就地编辑”的方法" 版本就像具有 -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' 替换为您希望它执行的任何命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2011-01-23
      • 2020-01-17
      • 2010-10-27
      • 2016-03-13
      • 2015-04-24
      • 2019-10-13
      相关资源
      最近更新 更多