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

Ale*_*lex 3 regex string bash shell

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

/usr/userName/config.cfg

要么

../config.cfg

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

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

Shell脚本的字符串操作功能本身看起来非常具有初衷性,并且显得非常深奥.

任何示例解决方案也受到赞赏.

gun*_*uns 11

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

FILE="/path/to/file.example"
FILE_BASENAME="${FILE##*/}"
Run Code Online (Sandbox Code Playgroud)

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

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

此外,还提供了一个简单的替换构造:

FILE=${FILE// /_}
Run Code Online (Sandbox Code Playgroud)

例如,将用下划线替换所有空格.

再次单一斜线,非贪婪.

  • +1.这个解决方案比执行外部命令要快得多,但正如枪所提到的,在这种情况下你应该使用`#!/ bin/bash`. (2认同)
  • +1感谢Double Hash/Double Percent贪婪家伙及其单身Hash/Percent非贪婪的解释.那是好事. (2认同)

Rob*_*obS 6

我只是使用而不是字符串操作

file=`basename "$filename"`
Run Code Online (Sandbox Code Playgroud)

编辑:

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

file=$(basename $filename)
Run Code Online (Sandbox Code Playgroud)

  • 为什么在地球上浪费了一百万个CPU周期来实现fork到`basename`?basename只是`$ {filename ##*/}`.**这是最好的方式**.这个答案是关于最糟糕的. (5认同)