首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl更改文件中的特定字段

使用perl更改文件中的特定字段
EN

Stack Overflow用户
提问于 2016-10-16 02:01:58
回答 1查看 498关注 0票数 0
代码语言:javascript
复制
perl -i -lape 'BEGIN{ $" = "|"} $F[$COLUMN]=$VALUE if $F[0] eq "$ID";' $FILE

因此,我尝试用特定的ID替换文件内部的行中的字段,并用给定的VALUE替换位于特定COLUMN的字段。当我执行时,不会在文件中进行任何更改。使用perl实现这一点很重要(所以没有awk或sed解决方案)。我几乎没有使用perl的经验,所以非常感谢精细化。

代码语言:javascript
复制
933|text1|text2|text3  
934|colm1|colm2|colm3
935|line1|line2|line3

假设使用value=newValue、column=2和id=934,则文件应如下所示

代码语言:javascript
复制
933|text1|text2|text3  
934|colm1|newValue|colm3
935|line1|line2|line3
EN

回答 1

Stack Overflow用户

发布于 2016-10-16 02:18:58

如果你写一个程序,而不是尝试一行程序,这将会有所帮助,因为这可能很难做到正确,特别是对于初学者。

什么是$COLUMN$ID$VALUE

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

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

也许这里更近一些?

代码语言:javascript
复制
perl -i -lane 'BEGIN{ $" = "|"} $F[$ENV{COLUMN}] = $ENV{VALUE} if $F[0] eq $ENV{ID}; print "@F";' $FILE

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

代码语言:javascript
复制
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";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40062436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档