bash замена после glob не работает? - PullRequest
0 голосов
/ 27 апреля 2020

Я сталкиваюсь со странным поведением при bash подстановке строк.

Я ожидал, что такая же замена на $ r1 и $ var даст точно такие же результаты. Кажется, обе строки имеют одинаковое значение.

Но дело не в этом, и я не могу понять, чего мне не хватает ....

Может быть, это из-за глобуса? Я просто не знаю ... Я не чистый айтишник, и, возможно, это будет для вас очевидным.

(внизу ссылки 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

echo $ {var %% _ S1 * z}

T21805 / T21805_SI-GA-D8-BH25N7DSXY

echo $ 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 4 c 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 4 c 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 ]

2 голосов
/ 27 апреля 2020

Расширение глобуса не происходит во время назначения.

$ 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, с которым можно было бы совпасть.

Если вы установите массив , правила назначения будут другими. Глобус расширяется до назначения, поэтому вы можете выполнять фильтрацию для каждого элемента массива.

$ 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
2 голосов
/ 27 апреля 2020

Я запустил его после 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.

...