blob替换后blob无法正常工作?

时间:2020-04-27 08:05:39

标签: bash substring substitution

我遇到了bash字符串替换的奇怪行为。

我期望在$ r1和$ var上进行相同的替换以产生完全相同的结果。 这两个字符串似乎具有相同的值。

但事实并非如此,我无法理解我所缺少的....

也许是因为存在问题?我只是不知道...我不是纯粹的IT专家,也许对您来说这很明显。

(位于Repl.it链接的底部)

mkdir -p T21805
touch T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz

r1=T21805/*R1*
echo $r1;
echo ${r1%%_S1*z}
var=T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
echo ${var%%_S1*z}

echo $r1| hexdump -C
echo $var | hexdump -C

输出:

回显$ r1

T21805 / T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz

回显$ {r1 %% _ S1 * z}

T21805 / T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz

回显$ {var %% _ S1 * z}

T21805 / T21805_SI-GA-D8-BH25N7DSXY

回显$ r1 | hexdump -C

00000000 54 32 31 38 30 35 2f 54 32 31 38 30 35 5f 53 49 | T21805 / T21805_SI |

00000010 2d 47 41 2d 44 38 2d 42 48 32 35 4e 37 44 53 58 | -GA-D8-BH25N7DSX |

00000020 59 5f 53 31 5f 4c 30 30 31 5f 52 31 5f 30 30 31 | Y_S1_L001_R1_001 |

00000030 2e 66 61 73 74 71 2e 67 7a 0a
| .fastq.gz。| 0000003a

echo $ var | hexdump -C

00000000 54 32 31 38 30 35 2f 54 32 31 38 30 35 5f 53 49 | T21805 / T21805_SI |

00000010 2d 47 41 2d 44 38 2d 42 48 32 35 4e 37 44 53 58 | -GA-D8-BH25N7DSX |

00000020 59 5f 53 31 5f 4c 30 30 31 5f 52 31 5f 30 30 31 | Y_S1_L001_R1_001 |

00000030 2e 66 61 73 74 71 2e 67 7a 0a
| .fastq.gz。| 0000003a

Repl.it

我有兴趣了解为什么它不起作用,例如,我可以使用sed实现我的愿望输出。

2 个答案:

答案 0 :(得分:2)

我在set -xv之后运行它来查看r1的内容。

$ r1=T21805/*R1*
+ r1='T21805/*R1*'

$ var=T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
+ var=T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz

r1中的$ {r1 %% _ S1 * z}T21805 / * R1 *

r1不包括_S1 * z

答案 1 :(得分:2)

在分配时不会发生全局扩展。

$ mkdir -p T21805
$ touch T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
$ touch T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_002.fastq.gz
$ r1=T21805/*R1*
$ printf '%s\n' "$r1"
T21805/*R1*
$ printf '%s\n' $r1
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_002.fastq.gz

未加引号的 r1扩展之后发生。当您编写${r1%%_S1*z}时,r1的值不包含字符串S1;只有在之后 ${r1}展开,您才能与S1相匹配。

如果设置了 array ,则分配规则将有所不同。全局扩展会在赋值之前 展开,因此您可以对数组的每个 element 进行过滤。

$ r1=( T21805/*R1* )
$ printf '%2\n' "${r1[@]}"
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_002.fastq.gz
$ printf '%s\n' "${r1[@]%%_S1*z}"
T21805/T21805_SI-GA-D8-BH25N7DSXY
T21805/T21805_SI-GA-D8-BH25N7DSXY