修改数组中的元素

时间:2018-01-05 11:30:50

标签: bash perl

我有一个如下所示的数组:

int, double

我不知道是否可能,但我想弄清楚如何做好几天。所以基本上我需要的是修改这个数组的元素,以便对于数组的每个元素(只有它包含C)我想删除之前的两个/三个字符,每当它遇到C.所以我最终会像这样的东西:

 C32
14(C55
2(C14
C10
3(C20
C10
2(O4 *149(H2
ZN C14
6(C5 6(C7 6(C3 6(C8 6(C11

3 个答案:

答案 0 :(得分:1)

使用sed。假设您的输入文件是 input.txt

sed '/C/s/[0-9]*(C/C/g' input.txt | sed '/C/s/^[^C]*//'

第一个sed命令删除C之前的数字和括号,第二个命令在C单独之前删除空格和其他字符。

例如,这是有效的。您必须检查所有案例是否匹配。

答案 1 :(得分:1)

#! /usr/bin/perl
use warnings;
use strict;

my @array = ('C32',
             '14(C55',
             '2(C14',
             'C10',
             '3(C20',
             'C10',
             '2(O4 *149(H2',
             'ZN C14',
             '6(C5 6(C7 6(C3 6(C8 6(C11');

my @expected = ('C32',
                'C55',
                'C14',
                'C10',
                'C20',
                'C10',
                '2(O4 *149(H2',
                'C14',
                'C5 C7 C6 C8 C11');

s/\S\S.?C/C/g for @array;

use Test::More tests => 1;
is_deeply \@array, \@expected;

请注意,测试失败,因为C3C6不相等。

答案 2 :(得分:0)

使用bash:

mapfile -t arr <<END
 C32
14(C55
2(C14
C10
3(C20
C10
2(O4 *149(H2
ZN C14
6(C5 6(C7 6(C3 6(C8 6(C11
END

for ((i=0; i<${#arr[@]}; i++)); do 
    if [[ ${arr[i]} == *C* ]]; then
        # replace digits and open parentheses before a C
        arr[i]=${arr[i]//+([0-9])(C/C}
    fi
done

printf "%s\n" "${arr[@]}"
 C32
C55
C14
C10
C20
C10
2(O4 *149(H2
ZN C14
C5 C7 C3 C8 C11