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发布于 2016-10-16 02:18:58
如果你写一个程序,而不是尝试一行程序,这将会有所帮助,因为这可能很难做到正确,特别是对于初学者。
什么是$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我认为这样写更具可读性。注意,我使用了Perl模块,这是一种将环境变量列表复制到同名Env变量的快速方法。
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";
}https://stackoverflow.com/questions/40062436
复制相似问题