我有多个作业名称不同的文件。作业名称指定如下。
#SBATCH --job-name=01_job1 #Set the job name
我想用sed/awk/grep自动获取名称,也就是说,'--job-name='后面和注释'#Set the job name'之前的内容。对于上面的例子,我想得到 01_job1。多个文件的作业名称可能会更长,并且文件中的以下行中有多个 = 符号。
我试过使用 grep -oP "job-name=\s+\K\w+" file
并得到一个空输出。我怀疑这不起作用,因为 'name=' 和 '01_job1' 之间没有空格,因此必须将它们理解为一个单词。
我也没有成功尝试使用 awk '{for (I=1;I<NF;I++) if ($I == "name=") print $(I+1)}' file
, 试图找到 'name=' 之后的字符。
最后我也试了失败sed -e 's/name=\(.*\)#Set/\1/'
文件以查找“name=”和注释“#Set”开头之间的字符。当我尝试这样做时,我收到了整个文件作为我的输出。
我很感激任何指导。谢谢!!
最佳答案
您需要将整个字符串与 sed 匹配并捕获您需要获取的内容,并使用 -n
选项和 p
标志:
sed -n 's/.*name=\([^[:space:]]*\).*/\1/p'
参见 online demo :
#!/bin/bash
s='#SBATCH --job-name=01_job1 #Set the job name'
sed -n 's/.*name=\([^[:space:]]*\).*/\1/p' <<< "$s"
# => 01_job1
详细信息:
-n
- 抑制默认行输出.*
- 任何文本name=
- 文字 name=
字符串\([^[:space:]]*\)
- 第 1 组 (\1
):除空格以外的任何零个或多个字符.*
- 任何文本p
- 打印成功替换的结果。https://stackoverflow.com/questions/75019663/