2016-01-03 4 views
-3

У меня есть п файлы, названные f1, f2 ..., Fn. Для каждого из этих файлов я должен выполнить команду sed и называть новые файлы как file1, file2, ..., filen.Создание файлов с управлением именами

Мне нужны новые файлы для хранения того же номера, что и их оригинальные. Может ли кто-нибудь помочь?

Вот что я пытался до сих пор:

#!/bin/sh 

for element in * 
do 
    echo "$element" sed -n '/Col3/p' $element > Quest $element 
done 
+2

Вы можете показать, что вы пробовали до сих пор? (Код) – DZDomi

+0

Я начинаю alogirithm: #/бен/ш # Fichier "Liste" для элемента * сделать \t эхо "$ элемент" СЭД -n '/ Col3/р'! $ element> Quest $ element done Это далеко не правильное, но я немного боюсь –

+0

Это не скрипт bash. Он запускается с помощью '/ bin/sh', поэтому даже если это bash, он запускается в режиме совместимости с POSIX. Вы хотите сделать это с помощью Bash-специфического способа, или вы после портативного решения, которое будет работать и в других оболочках, как показывает ваш пример? – ghoti

ответ

0
#!/bin/env bash 

for FILE in * 
do 
    [[ "$FILE" =~ [0-9]+$ ]] && mv "$FILE" file${BASH_REMATCH[0]} 
done 

Выражение в [[ ]] тест, который проверяет на совпадение с регулярным выражением, которое ищет строку, заканчивающуюся в ряде. Если совпадение выполнено успешно, совпадающее число можно найти в переменной массива bashBASH_REMATCH по индексу 0. Часть после && выполняется, если тест завершается успешно, и переименовывает файл в fileNN,

+0

Кодовые ответы не очень полезны. Пожалуйста, подумайте над тем, чтобы добавить пояснительный текст. –

1

Если мы предположим, что все ваши файлы находятся в форме в вашем вопросе ...

$ ls -l 
total 2 
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f1 
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f2 
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f3 
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f4 

то вы на правый трек с петлей for. Но вы, вероятно, хотите сузить свой поиск только теми файлами, которые важны для вас.

В bash вы можете использовать extglob для управления этим делом. Например:

#!/usr/bin/env bash 

shopt -s extglob 
for file in +([a-z])+([0-9]); do 
    echo "Old: $file/New: file${file##[a-z]}" 
done 

Это соответствует любым файлам, имена которых состоят из букв, сопровождаемых цифрами.

Если, с другой стороны, вы хотите сделать этот перенос, чтобы он работал в оболочке POSIX (поскольку в вашем вопросе вы указали /bin/sh), вы можете поместить обнаружение в сам цикл:

#!/bin/sh 

for file in *; do 
    if ! expr "$file" : '[a-z][a-z]*[0-9][0-9]*$' >/dev/null; then 
    continue 
    fi 
    echo "Old: $file/New: file${file##[a-z]}" 
done 

В обоих этих примерах мы используем POSIX «Расширение параметров» для удаления букв в начале имени файла.

Смежные вопросы