在shell脚本中进行字符串操作的最佳方法是什么?

时间:2009-03-12 14:52:04

标签: regex string bash shell

我在shell脚本中有一个字符串作为字符串,可以是绝对的或相对的:

/usr/userName/config.cfg

../的config.cfg

我想提取文件名(在最后一个之后的部分,所以在这种情况下:“config.cfg”)

我认为最好的方法是使用一些简单的正则表达式? 它是否正确?我应该或应该使用sed还是awk?

Shell脚本的字符串操作功能本身看起来非常具有推动力,看起来非常深奥。

也欢迎任何示例解决方案。

4 个答案:

答案 0 :(得分:11)

如果您对使用bash没问题,可以使用bash字符串扩展:

FILE="/path/to/file.example"
FILE_BASENAME="${FILE##*/}"

它有点神秘,但是大括号开始变量扩展,而double hash从字符串的开头贪婪地删除指定的glob模式。

Double %%在字符串末尾执行相同的操作,而单个百分比或散列执行非贪婪删除。

此外,还可以使用简单的替换构造:

FILE=${FILE// /_}
例如,

会用下划线替换所有空格。

再次单一斜线,非贪婪。

答案 1 :(得分:6)

我只使用

而不是字符串操作
file=`basename "$filename"`

修改

感谢您放松一些更新的语法(假设您的文件名保存在$ filename中):

file=$(basename $filename)

答案 2 :(得分:1)

大多数环境都可以访问perl,而且对于大多数字符串操作我都更为自满。

但如上所述,从简单的事情来看,你可以使用basename

答案 3 :(得分:1)

我通常使用带有简单正则表达式的sed,如下所示:

echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'

结果:

>echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'
config.cfg