在 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/'
需要在打印第一行时通过剥离 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/'