0

您好:我有很多文件被调用test-MR3000-1.txttest-MR4000-1.nt其中名称中的数字更改了 100(即我有 11 个文件),

$ ls test-MR*
test-MR3000-1.nt  test-MR3300-1.nt  test-MR3600-1.nt  test-MR3900-1.nt
test-MR3100-1.nt  test-MR3400-1.nt  test-MR3700-1.nt  test-MR4000-1.nt
test-MR3200-1.nt  test-MR3500-1.nt  test-MR3800-1.nt

还有一个名为resonancia.kumacwhich in a couple on lines 的文件包含字符串XXXX.

$ head resonancia.kumac
close 0
hist/delete 0
vect/delete *
h/file 1 test-MRXXXX-1.nt
sigma MR=XXXX

我想执行一个bash文件,用XXXX从命令中获得的一组数字替换文件中的字符串ls *MR* | cut -b 8-11

我找到了一个帖子,其中有一些建议。我尝试自己的代码

for i in `ls *MR* | cut -b 8-11`; do
    sed -e "s/XXXX/$i/" resonancia.kumac >> proof.kumac
done

但是,在替换中,数字被单引号包围(例如'3000')。

问:如何避免数字集中出现单引号?谢谢你。

4

2 回答 2

3

这是所描述环境的复制器:

for ((i=3000; i<=4000; i+=100)); do
  touch test-MR${i}-1.nt
done
cat >resonancia.kumac <<'EOF'
close 0
hist/delete 0
vect/delete *
h/file 1 test-MRXXXX-1.nt
sigma MR=XXXX
EOF

这是一个将在该环境中运行的脚本:

content="$(<resonancia.kumac)"
for f in *MR*; do
    substring=${f:7:3}
    echo "${content//XXXX/$substring}"
done >proof.kumac

...输出如下所示:

close 0
hist/delete 0
vect/delete *
h/file 1 test-MR300-1.nt
sigma MR=300

此输出中没有引号;所描述的问题未重现。

于 2013-06-18T16:58:43.543 回答
1

或者如果它可能是 perl:

#!/usr/bin/perl
@ls = glob('*MR*');

open (FILE, 'resonancia.kumac') || die("not good\n");

@cont = <FILE>;

$f = shift(@ls);
$f =~ /test-MR([0-9]*)-1\.nt/;
$nr = $1;

@out = ();
foreach $l (@cont){
    if($l =~ s/XXXX/$nr/){
        $f = shift(@ls);
        $f =~ /test-MR([0-9]*)-1\.nt/;
        $nr = $1;
    }
    push @out, $l;
}

close FILE;
open FILE, '>resonancia.kumac' || die("not good\n");
print FILE @out;

那将用第一个文件名替换第一个 XXXX,这似乎是更改之前的问题。

于 2013-06-18T17:14:25.277 回答