如何从文件名中获取字符串并将其用作参数

时间:2012-04-05 03:48:27

标签: bash shell

如果文件名采用此格式

assignment_number_username_filename.extension

实施例

assignment_01_ssaha_homework1.txt

我需要只提取用户名以在脚本的其余部分中使用它。

如何仅使用用户名并将其用作参数。

这接近我正在寻找的但不完全正确:

Extracting a string from a file name

如果有人能够解释sed在这种场景中的效果,那将会有所帮助!

这是我到目前为止所拥有的;我暂时没有使用cut因此我在尝试刷新自己时收到错误消息。

 #!/bin/sh 
 a = $1
 grep $a /home | cut -c 1,2,4,5 echo $a`

3 个答案:

答案 0 :(得分:1)

您可能需要命令替换,加上echosed。您需要知道sed正则表达式可以记住匹配的部分内容。而且你需要知道基本的正则表达式。在上下文中,这加起来:

filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | sed 's/^[^_]*_[^_]*_\([^_]*\)_[^.]*\.[^.]*$/\1/')

$(...)表示法是命令替换。运行括号之间的命令,并将输出捕获为字符串。在这种情况下,字符串将分配给变量username

sed命令中,整个命令对每行输入应用特定的替换(s/match/replace/)操作(这里,这将是一行)。正则表达式的[^_]*组件匹配一系列(零个或多个)非下划线。 \(...\)部分会记住所附的正则表达式(第三个非下划线序列,即用户名)。最后切换到[^.]*可识别分隔符从下划线到点的更改。替换文本\1将整个名称替换为模式的记忆部分。通常,您可以拥有该模式的几个记​​住的子部分。如果文件名与模式不匹配,您将获得输入作为输出。

bash中,有一些方法可以避免echo;您可能能够使用一些更深奥的(意思是“在其他shell中不可用”)机制来提取数据。这将适用于大多数现代POSIX派生的shell(Korn,Bash等)。

答案 1 :(得分:0)

filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | awk -F_ '{print $3}')

答案 2 :(得分:0)

只是打击:

filename="assignment_01_ssaha_homework1.txt"
tmp=${filename%_*}
username=${tmp##*_}

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion