您好:我有很多名为test-MR3000-1.txt
到test-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.kumac
的文件,它在一对行中包含字符串XXXX
。
$ head resonancia.kumac
close 0
hist/delete 0
vect/delete *
h/file 1 test-MRXXXX-1.nt
sigma MR=XXXX
我想执行一个bash
文件,该文件用一组从XXXX
命令获得的数字替换文件中的strig ls *MR* | cut -b 8-11
。
我找到了a post,其中有一些建议。我尝试自己的代码
for i in `ls *MR* | cut -b 8-11`; do
sed -e "s/XXXX/$i/" resonancia.kumac >> proof.kumac
done
然而,在替换中,数字被sigle qoutes包围(例如'3000'
)。
问:我应该怎么做以避免数字集中的单引号?谢谢。
答案 0 :(得分: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
此输出中的任何位置都没有引号;描述的问题没有复制。
答案 1 :(得分: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,这似乎是更改前的问题。