如何从一个文件名字符串,采取并用它作为参数

问题描述:

如果文件名的格式如下如何从一个文件名字符串,采取并用它作为参数

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` 
+0

Iv'e一直停留在尝试这一部分的代码剩下的只是与当时提取的用户名建立新目录和移动包含文件那些用户名到相关的目录。你知道一个很好的链接来解释如何使用sed命令吗? – AlecWiese 2012-04-05 03:52:18

+0

你只是想从字符串中提取第三个单词吗?看看'cut'命令。 – 2012-04-05 04:02:13

+0

是的,这是主要问题,我只需要稍后能够使用它来做我在下面的评论中描述的杰里米D.并且它是否可以削减扩展? – AlecWiese 2012-04-05 04:04:13

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

filename="assignment_01_ssaha_homework1.txt" 

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

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

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

bash,有避免echo;你可能会使用一些更深奥的(意味着'其他shell中不可用')机制来提取数据。这将适用于大多数现代POSIX衍生的炮弹(Korn,Bash和其他炮弹)。

+0

非常感谢,用命令行参数替换'filename =“assignment_01_ssaha_homework1.txt”'是否安全? – AlecWiese 2012-04-05 04:18:55

+0

@AlecWiese:当然,我只是确保你看到了我正在使用的名字,并且指出你指定的问题中可能存在的问题,强调了分隔组件,但是在示例名称中不显示下划线,如果格式是问题,请记住缩进这个例子由(至少)4个空格来表示获得'代码'格式(恒定宽度字体和下划线下划线)。 – 2012-04-05 04:41:53

+0

是的下划线是必要的,我不知道为什么我忘记了他们在我的操作。再次感谢您的帮助! – AlecWiese 2012-04-05 04:43:36

filename="assignment_01_ssaha_homework1.txt" 

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

只是庆典:

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

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