3

如果文件名是这种格式

assignment_number_username_filename.extension

前任。

assignment_01_ssaha_homework1.txt

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

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

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

从文件名中提取字符串

如果有人可以解释 sed 在这种情况下的工作原理,那将同样有帮助!

这是我到目前为止所拥有的;我有一段时间没有使用cut了,所以在尝试刷新自己时收到错误消息。

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

3 回答 3

1

您可能需要命令替换,加上echoplus sed。您需要知道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 等)。

于 2012-04-05T04:13:46.347 回答
0
filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | awk -F_ '{print $3}')
于 2012-04-05T05:54:26.477 回答
0

猛击:

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

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

于 2012-04-05T14:54:57.800 回答