【问题标题】:SED command inside a loop循环内的 SED 命令
【发布时间】:2013-06-14 23:29:02
【问题描述】:

您好:我有很多文件名为 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.kumac 的文件,其中的几行包含字符串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 获得的一组数字。

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

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

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

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

【问题讨论】:

  • 永远不要以这种方式使用 ls。见mywiki.wooledge.org/ParsingLs
  • ...另外,您没有以让其他人重现它的方式描述您的问题,所以我看不出任何人可以帮助您解决它。有人需要知道您正在使用的文件名、输入文件的实际内容、您获得的实际输出等。如果您可以提供一个独立的脚本来创建必要的文件和输入,然后用这些文件和输入重现问题它创建的输入 - 因此,从无到有重现问题的东西 - 这将是有帮助的。
  • 您提供的代码不会插入单引号,对我来说效果很好。请复制粘贴此代码并重试,不要对您提到的帖子进行任何临时更改。
  • @Dox 虽然原始代码没有您在此处询问的错误,但它确实有其他错误。请考虑利用此处提供的改进。

标签: linux bash loops sed do-loops


【解决方案1】:

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

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

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

【讨论】:

  • 你能解释一下echo "${content//XXXX/$substring}"${f:7:3}吗?
【解决方案2】:

或者如果它可以是 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,这似乎是更改之前的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2015-01-26
    • 2014-06-15
    • 2016-07-27
    • 2016-07-07
    • 2023-03-30
    • 2021-02-04
    相关资源
    最近更新 更多