我有一个如下所示的数组:
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
答案 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;
请注意,测试失败,因为C3
和C6
不相等。
答案 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