2016-02-04 2 views
1

Я хотел бы удалить имя файла только из следующего файла конфигурации.Как удалить имя файла из списка пути в оболочке

Файл конфигурации - test.conf

knowledgebase/arun/test.rf 
knowledgebase/arunraj/tester/test.drl 
knowledgebase/arunraj2/arun/test/tester.drl 

выше файл должен быть прочитан. И удаленное содержимое должно отправиться в другой файл с именем output.txt

Ниже приведены мои попытки. Это не работает ко мне. Я получаю только пустые файлы.

#!/bin/bash 
file=test.conf 
while IFS= read -r line 
do 
#  grep --exclude=*.drl line 
#  awk 'BEGIN {getline line ; gsub("*.drl","", line) ; print line}' 
#  awk '{ gsub("/",".drl",$NF); print line }' arun.conf 
#  awk 'NF{NF--};1' line arun.conf 
echo $line | rev | cut -d'/' -f 1 | rev >> output.txt 
done < "$file" 

Ожидаемый результат:

knowledgebase/arun 
knowledgebase/arunraj/tester 
knowledgebase/arunraj2/arun/test 

ответ

3

Там же команда dirname, чтобы сделать его легко и надежно:

#!/bin/bash 
file=test.conf 
while IFS= read -r line 
do 
    dirname "$line" 
done < "$file" > output.txt 

Есть Bash shell parameter expansions, которые будут нормально работать со списком имен, данных, но не будет работать надежно для некоторых имен:

file=test.conf 
while IFS= read -r line 
do 
    echo "${line%/*}" 
done < "$file" > output.txt 

Там в sed сделать работу - легко с заданным набором имен:

sed 's%/[^/]*$%%' test.conf > output.txt 

Это хар если вам нужно иметь дело с именами, такими как /plain.file (или plain.file - те же самые кромки, которые вызывают расширение оболочки).

Вы можете добавить варианты Perl, Python, Awk в список способов выполнения задания.

+1

Ed Мортона будет применяться здесь. «Если вы используете цикл оболочки для обработки текстового файла, вы делаете это неправильно». – tripleee

+0

Вот почему я включил опцию 'sed' - это, или Perl или Python, то, что я использовал бы для данной задачи. Это зависит от того, есть ли что-нибудь еще в цикле. По моему опыту, вам часто требуется «sort -u» для удаления дубликатов каталогов из списка каталогов. Однако это легко обрабатывается в любом из скриптов. Конвейер с 4 командами на имя файла ужасен по сравнению с любым из этих решений. –

2

Использование AWK один лайнер вы можете сделать это:

awk 'BEGIN{FS=OFS="/"} {NF--} 1' test.conf 

Выход:

knowledgebase/arun 
knowledgebase/arunraj/tester 
knowledgebase/arunraj2/arun/test 
1

Вы можете получить этот путь:

path=${fullpath%/*} 

Он отсекает строку после стандартной диатрибы последнего/

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