如何使用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##/*/}

但是,当在哪里/在后面的单词中时,这是不起作用的。所以我首先想得到第一个单词,然后做上面这样的事情。

我会在while循环中使用read来获得第一个字,然后使用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

最接近您所做的(可能也是最快的)解决方案是

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

最新更新