С GNU grep
и при условии, что имена файлов не содержат двоеточие или символы новой строки:
$ ls
bar baz foo freeble quux
$ cat./*
# order: 3
# order: 2
# order: 1
# order: 4
# order: 5
$ grep -m1 -EH '^# order: [0-9]+$'./* | sort -n -k3 | cut -d: -f1
foo
baz
bar
freeble
quux
Добро пожаловать на сайт.
Я думаю, что вы смешиваете "подстановочные знаки" (, также известные как " оболочки " )с регулярными выражениями при использовании sed
.
Очевидно, вы намерены заменить шаблон «подчеркивание, за которым следует любое количество букв и цифр, за которым следует .gc_corrected.bam
» на _input.gc_corrected.bam
. К сожалению, ваше выражение sed
имеет два недостатка:
sed
ожидает здесь регулярное выражение, а в регулярных выражениях *
означает не «любую строку из нуля или более символов», а «ноль или более повторений предыдущего символа».,так что ваше выражение заменит любой шаблон, состоящий из «ноль или более знаков подчеркивания, за которыми следует .gc_corrected.bam
» заменой _input.gc_corrected.bam
. Вот почему в вашем случае просто последнее подчеркивание перед суффиксом имени файла заменяется на _input
. _mESC_Rep_1_H3K27Ac
часть имени файла на _input
. В вашем случае правильным регулярным выражением будет:
sed 's/_[^_]+\.gc_corrected\.bam/_input.gc_corrected.bam/g'
Это заменит строку, начинающуюся с символа подчеркивания _
, за которым следует один или несколько символов , которые не являются символами подчеркивания ([^_]+
), за которыми следует .gc_corrected.bam
, с вашей заменой _input.gc_corrected.bam
.
Обратите также внимание , что в регулярных выражениях .
означает «любой одиночный символ» (, который в глобах оболочки будет представлен ?
), поэтому, если вы хотите сопоставить литерал .
, вы должны избежать его. Это, конечно, не обязательно в строке замены, так как , что не является регулярным выражением.