我的字符串是这种格式。
/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