2016-01-11 6 views
0

Моя строка относится к этому формату.Как получить часть первого слова в строке из нескольких слов, используя ksh

/abc/def/ghi.klm_nop.out abc def /abc/mno xxx xxx 

Или

/abc/def/ghi.out abc def /abc/mno xxx xxx 

Или

./ghi.klm_nop.out abc def /abc/mno xxx xxx 

Или

./ghi.klm_nop.out abc def /abc/mno xxx xxx 

Я хочу, чтобы извлечь из всего

ghi.klm_nop.out 

или ghi.out

Что мой лучший выбор, используя Ksh.

Я пытаюсь кое-что как

str='/abc/def/ghi.klm_nop.out abc def /abc/mno xxx xxx ' 
echo ${str##/*/} 

Но это не работает, если где/в словах после. Итак, я сначала хочу получить первое слово, а затем сделать что-то вроде выше.

ответ

0

Я хотел бы использовать read в while цикле, чтобы получить первое слово, а затем basename сдирать путь:

while read -r path rest; do 
    file=$(basename "$path") 
    echo "$file" 
done <<END 
/abc/def/ghi.klm_nop.out abc def /abc/mno xxx xxx 
/abc/def/ghi.out abc def /abc/mno xxx xxx 
./ghi.klm_nop.out abc def /abc/mno xxx xxx 
./ghi.klm_nop.out abc def /abc/mno xxx xxx 
END 
ghi.klm_nop.out 
ghi.out 
ghi.klm_nop.out 
ghi.klm_nop.out 
0

Решение близкое к тому, что вы сделали (и, возможно, самый быстрый) , является

echo "Internal" 
for str in "/abc/def/ghi.klm_nop.out abc def /abc/mno xxx xxx" \ 
     "/abc/def/ghi.out abc def /abc/mno xxx xxx " \ 
     "./ghi.klm_nop.out abc def /abc/mno xxx xxx " \ 
     "./ghi.klm_nop.out abc def /abc/mno xxx xxx "; do 
    tmp=${str%% *} 
    echo "${tmp##*/}" 
done 

с большим терпением вы можете сделать много с sed:

echo "Sed" 
for str in "/abc/def/ghi.klm_nop.out abc def /abc/mno xxx xxx" \ 
     "/abc/def/ghi.out abc def /abc/mno xxx xxx " \ 
     "./ghi.klm_nop.out abc def /abc/mno xxx xxx " \ 
     "./ghi.klm_nop.out abc def /abc/mno xxx xxx "; do 
    echo "${str}" | sed -e 's/ .*//' -e 's#.*/##' 
done 

И когда вы готовы узнать AWK следующей смеси вариант:

echo "Awk" 
for str in "/abc/def/ghi.klm_nop.out abc def /abc/mno xxx xxx" \ 
     "/abc/def/ghi.out abc def /abc/mno xxx xxx " \ 
     "./ghi.klm_nop.out abc def /abc/mno xxx xxx " \ 
     "./ghi.klm_nop.out abc def /abc/mno xxx xxx "; do 
    echo "${str%% *}"| awk -F"/" '{print $NF}' 
done