在Shell中使用字符串作为分隔符剪切字符串

时间:2016-03-22 16:29:05

标签: bash shell cut

需要在打印第一行时删除libcom.so来打印1.0.0

#!/bin/sh
data=$(sed '0,/^__VERSION__$/d' "$0")
for d in $data
do
     echo with version:
     echo $d
     echo "with no version" 
     d1="$(cut -d\.so -f1 <<< $d)"
     #Need to save it in a variable for further processing
     echo $d1
done

exit

__VERSION__
libcom.so.1.0.0
libclock.so.1.0.0
libstdc++.so.6.0.20
libxml.so.2.7.8
libmi.so.1.0.0
librt.so.6.6.5
libcsapi.so.1.0.0

错误显示为cut: the delimiter must be a single character,最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您只想将字符串放到第一个.so之前,bash会很乐意为您处理:

d1="${d%%.so*}.so"

${d%%.so*}删除与%%匹配的变量d右侧.so*中最长的字符串。这有效地删除了从.so开始直到字符串结尾的所有内容。然后,我们手动重新添加我们删除的.so,因为%%删除了整个匹配的部分,而不仅仅是通配符部分。

有关详细信息,请参阅parameter expansion上的本指南。

或者,您可以使用sed,即使它会慢得多:

d1=$(sed 's/\(\.so\).*$/\1/' <<< $d)

答案 1 :(得分:0)

当您的find支持文件名作为第一个参数时,您可以使用

find lib*so* | sed 's/\.so.*/.so/'