Заменить символ, если ему не предшествует подстрока - PullRequest
0 голосов
/ 09 октября 2018

У меня есть большое количество файлов с именами, такими как

name.of.file.to.change.fastq.

Я хотел бы изменить все периоды в имени на подчеркивания, за исключением последнего периода, который предшествует«fastq», чтобы получить

name_of_file_to_change.fastq

Я видел ответ здесь с использованием sed, который заменяет символ, если только после него нет определенного символа, ноЯ не смог выяснить, как расширить поиск одного символа в подстроке.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

sed излишне для этого.Попробуйте этот код Bash (+ mv):

shopt -s nullglob   # Globs that match nothing expand to nothing
shopt -s dotglob    # Globs can expand to names that start with '.'

for file in *.*.fastq ; do
    base=${file%.fastq}     # Remove '.fastq' suffix
    newbase=${base//./_}    # Change all '.' to '_'
    newfile=$newbase.fastq  # Add back the '.fastq' suffix

    # If the new filename already exists, issue a warning and don't clobber it
    if [[ -e $newfile || -L $newfile ]] ; then
        printf 'Warning: "%s" exists.  Skipping "%s"\n' "$newfile" "$file" >&2
    else
        mv -- "$file" "$newfile"
    fi
done

См. Расширение параметров [Bash Hackers Wiki] для объяснений ${file%.fastq} и ${base//./_}.

0 голосов
/ 10 октября 2018

Попробуйте сначала выполнить echo, выполнив mv:

echo mv ${f} $(tr '.' '_' <<< "${f%.*}").${f##*.}
# When ok
mv ${f} $(tr '.' '_' <<< "${f%.*}").${f##*.}
0 голосов
/ 09 октября 2018

Со вкусом перл rename вы можете сделать

rename -n 's/\.fastq$//; tr/./_/; $_.=".fastq"' *.fastq
# or
rename -n 'tr/./_/; s/_(?=fastq$)/./' *.fastq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...