2016-08-29 2 views
4

Я пытающийся захватить имена файлов удаления как файл-расширение и суффикс, например:Regex - не извлекать вплоть до матча и не включая этот матч

TEST_EXAMPLE_SUFFIX.file 
Output = TEST_EXAMPLE 

Я хочу сделать это на основе сопоставления часть _SUFFIX и извлечение всех символов до этого (не включая _SUFFIX). Обычно я хотел бы использовать что-то вроде:

FILE_EXT=_SUFFIX 
/.+?(?=$FILE_EXT)/ 

Однако, когда трубопроводы, которые вместе как часть для петли:

for t in $(ls *.fastq | sed -e /.+?(?=$READ1_EXT)/) 

Я получаю ошибку:

command substitution: line 14: syntax error near unexpected token `(' 

Что я сделал неправильно?

ответ

5

Не разобрать ls выход, Вы можете использовать расширение параметров Баш для добиться того, что вам нужно

for t in *_SUFFIX.fastq 
do 
    echo "${t%_SUFFIX.fastq}" #stips _SUFFIX.fastq part 
done 

Ссылки


Edit:

Для работы вокруг повторных вхождений, вы могли бы сделать что-то вроде этого:

Считайте, что у вас есть два файла, представляющие интерес Test_R1.file & Test_R2.file и вы ожидаете Test появляться только один раз в результатах, сделайте что-то вроде

declare -A arry # declaring an associative array 
for t in Test_R*.file 
do 
    arry["${t%_R*.file}"]=1 
    # stips _R(number).file part and makes it a key to arry 
    # Remember arry keys are unique. 
    # The assignment ie '=1' is not relevant here, you can assign any value 
done 
# We are all set to print the unique filenames 
echo "${!arry[@]}" 
# "${!arry[@]}" expands to the list of array indices (keys) for arry 
+0

Спасибо! Из интереса, как эта проблема будет решена, если | блок обычно добавлялся к линии цикла, поскольку есть несколько файлов с тем же именем файла, но вы хотите только перебирать уникальные экземпляры? – AnnaSchumann

+0

@AnnaSchumann: Прежде всего, в одном каталоге, как вы уже знаете, вы не можете иметь несколько файлов с тем же именем файла. Вы хотели искать файлы в подкаталогах? – sjsam

+0

Извините за отсутствие ясности. Скажем, все файлы попадают в пары - и отличаются только от суффикса _R1 и _ R2, такого как Test_R1.file и Test_R2.file. Я только хочу захватить часть «Тест» один раз, но в нормальном цикле он будет отображаться дважды.Обычно я использовал Rev, cut и uniq, чтобы захватить «Test» на линии цикла, но это довольно негибко, если суффикс изменится. – AnnaSchumann

1

Вы можете сделать это, используя расширение параметра bash только при условии, постоянный формат имен файлов:

for file in *_SUFFIX.fastq; do echo "${file%_*}"; done 

for конструкция итерацию по .fastq файлов.

Пример:

$ file=TEST_EXAMPLE_SUFFIX.fastq 

$ echo "${file%_*}" 
TEST_EXAMPLE 
+0

Если вы не используете '* _SUFFIX.fastq' в цикле for, вам может понадобиться' echo '$ {file% _SUFFIX.fastq} "' – sjsam

+1

@sjsam достаточно справедливо, я сделал пример OP буквально .. отредактировал отредактированный ..благодаря – heemayl