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

cut the string using string as delimiter in Shell

需要在打印第一行时通过剥离 1.0.0 来打印 libcom.so

#!/bin/sh
data=$(sed '0,/^__VERSION__$/d' "[=11=]")
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,最好的方法是什么?

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

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

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

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


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

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

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

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