【问题标题】:change specific field in file using perl使用 perl 更改文件中的特定字段
【发布时间】:2017-02-25 00:33:51
【问题描述】:
perl -i -lape 'BEGIN{ $" = "|"} $F[$COLUMN]=$VALUE if $F[0] eq "$ID";' $FILE

所以我尝试用特定的ID 替换文件内部存在的字段,并用给定的VALUE 替换特定的COLUMN。当我执行时,文件内没有进行任何更改。我用 perl 来做这件事很重要(所以没有 awk 或 sed 解决方案)。我对 perl 的经验很少,因此非常感谢详细说明。

933|text1|text2|text3  
934|colm1|colm2|colm3
935|line1|line2|line3

说 value=newValue column=2 和 id=934 所以文件应该是这样的

933|text1|text2|text3  
934|colm1|newValue|colm3
935|line1|line2|line3

【问题讨论】:

  • 目前还不清楚(至少对我来说)你想用什么替换什么。您能否显示几行输入以及该特定输入所需的输出?
  • 如果您编写程序而不是尝试单行程序会有所帮助,这可能很难做到正确,尤其是对于初学者而言。 $ID$VALUE 是什么? Perl 将它们视为您尚未定义的 Perl 变量,因此它们都作为空字符串工作。如果您打算使用 shell 中的环境变量,那么您需要 $ENV{ID}$ENV{VALUE}

标签: bash perl file replace append


【解决方案1】:

如果您编写一个程序而不是尝试单行程序会有所帮助,这可能很难做到正确,尤其是对于初学者而言。

什么是$COLUMN$ID$VALUE

Perl 将它们视为您尚未定义的 Perl 变量,因此它们都作为空字符串工作。

如果您打算在 shell 中使用环境变量,那么您需要 $ENV{COLUMN}$ENV{ID}$ENV{VALUE}。 此外,您的-p 选项会在您阅读每一行后打印$_ 的值。由于您不更改它,因此您修改 @F 的代码没有可见效果

也许这更近了?

perl -i -lane 'BEGIN{ $" = "|"} $F[$ENV{COLUMN}] = $ENV{VALUE} if $F[0] eq $ENV{ID}; print "@F";' $FILE

我认为这样写更易读。请注意,我使用了 Env 模块,这是一种将环境变量列表复制到同名 Perl 变量的快速方法

use strict;
use warnings 'all';

use Env qw/ COLUMN VALUE ID /;

our $^I = "";     # Enable in-place editing

while ( <> ) {

    my @fields = split /\|/;

    $fields[$COLUMN] = $VALUE if $fields[0] eq $ID;

    print join('|', @fields), "\n";
}

【讨论】:

  • @JimS 你设置了 Borodin 引用的环境变量吗?
  • @PerlDuck 是的,这些变量实际上是用来存储来自 bash 命令的参数
  • @JimS:你export那些变量了吗?除非您这样做,否则它们仅在您的 shell 脚本中可见。也许您最好向我们展示您正在执行的完整命令序列。
  • @JimS 将-w 开关添加到您的单行。如果环境。 vars 已设置,您应该会看到 no Use of uninitialized value… 警告。
  • 好的,看看您的示例输入数据,它似乎是管道分隔的。 Perl 命令行上的一个简单的-a 将在空白处拆分,因此每一行都只是@F 的一个元素。您需要为 -F 选项添加一个值,该选项指定要拆分的模式,但管道是正则表达式元字符,因此您需要对其进行转义。你真的写一个程序会更好。我已经在我的回答中编辑了程序来为你做这件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2012-03-02
  • 2016-06-16
  • 2020-06-29
相关资源
最近更新 更多