0

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置き換えるファイルを実行したいと考えています。XXXXls *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')。

Q:数字のセットで一重引用符を避けるにはどうすればよいですか? ありがとうございました。

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 に答える