如果文件名采用此格式
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 :(得分:1)
您可能需要命令替换,加上echo
加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等)。
答案 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