【问题标题】:System command ( sed ) in perlperl 中的系统命令 (sed)
【发布时间】:2021-11-24 06:33:25
【问题描述】:

我在一个 perl 输入文件句柄循环中,(而 FH),我需要在该循环中对另一个文件执行搜索和删除操作。

我想对循环中的文件执行 sed 操作,并希望将 command/sed 的输出捕获到数组变量中。

类似这样的:

@flops_ = `sed '/$clkname[-2]/d' occ.txt'` 

此操作的最佳方法应该是什么?

occ.txt

/server/home/ramneek/kings/abc_occ/flop0/Q
/server/home/ramneek/kings/abc_occ/flop1/Q
/server/home/ramneek/kings/def_occ/flop0/Q
/server/home/ramneek/kings/def_occ/flop1/Q
/server/home/ramneek/kings/xyz_occ/flop0/Q
/server/home/ramneek/kings/xyz_occ/flop1/Q

abc,def, xyz 是变量。在每个父循环中,clkname[-2] 都会得到这些变量。在每个循环中,我需要删除相应的变量匹配行。

在父 while 循环的第一次迭代中, @flops_ 应该看起来像和由\n 字符分隔的数组

/server/home/ramneek/kings/def_occ/flop0/Q
/server/home/ramneek/kings/def_occ/flop1/Q
/server/home/ramneek/kings/xyz_occ/flop0/Q
/server/home/ramneek/kings/xyz_occ/flop1/Q

在第二次迭代中 @flops_ 应该是

/server/home/ramneek/kings/abc_occ/flop0/Q
/server/home/ramneek/kings/abc_occ/flop1/Q
/server/home/ramneek/kings/xyz_occ/flop0/Q
/server/home/ramneek/kings/xyz_occ/flop1/Q

等等。 TIA。

【问题讨论】:

  • “我在一个 perl 输入文件句柄循环中”:似乎问题与循环无关?您只需要更改另一个文件(不是您现在正在读取的文件),对吗?
  • 是的。但我不想在父循环中读取另一个文件(我想要更改的文件)。所以,我正在寻找一个系统命令来进行搜索和删除,而不是逐行读取文件。
  • 好的,你能举个文件occ.txt的例子吗?那么系统调用后@flops_数组的内容应该是什么?
  • 感谢您的更新。当前的sed 命令有什么问题?看起来应该可以正常工作吧?

标签: regex perl system backticks


【解决方案1】:

最好的方法是全部在 perl 中完成;将文件的行读入一次数组,然后在循环中使用grep 过滤掉不需要的元素。

# read the lines of occ.txt into an array 
# (or use File::Slurper or Path::Tiny to do it)
open my $focc, "<", "occ.txt" or die "Couldn't open occ.txt: $!";
my @occ = <$focc>;
chomp @occ;
close $focc;

...;

while (<$fh>) {
    ...;
    # Filter out elements
    my @flops_ = grep { not /$clkname[-2]/ } @occ;
    ...;
}

【讨论】:

  • 可能还有其他方法,例如在 @occ 上的 foreach 循环,这比创建一个新数组更合适,但这取决于您稍后使用 @flops_ 做什么。跨度>
  • 嗨,肖恩!!,谢谢它的工作。
猜你喜欢
  • 2017-03-15
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2018-06-26
  • 2018-08-17
  • 2014-08-16
相关资源
最近更新 更多