regex - Linux 提取特定字符串之间的文本

我有多个作业名称不同的文件。作业名称指定如下。

#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/

相关文章:

r - 在 mutate 中将参数传递给 pmap

python - 无法使用调试暂停 python 进程

python - Pandas 将 df.count() 结果的最后 n 行求和为一行

LUA - 表中最常见的项目

powershell - 如何在 PowerShell 方法链接中使用换行符

arrays - 如何将数组的元素移动到数组的开头

python - 什么时候值得在 if-else 语句上使用循环?

c# - C# 是否有某种 value_or_execute 或 value_or_throw?

r - 如何将整行作为列名?

haskell - 减少围绕手工包装的 `Num` 类型的样板