【问题标题】:Extract a string from all lines in a file从文件的所有行中提取字符串
【发布时间】:2025-12-12 11:25:02
【问题描述】:

我想从文件中的所有行中提取一个具有唯一前缀的字符串。 虽然我不擅长字符串操作和正则表达式,但我尝试使用 sed、cut 命令但未能提取字符串。

我的示例文件看起来像

string1 string2 PREFIX_some_string1 string3 string4
string5 string6 PREFIX_some_string2 string7 string8
string9 string10 PREFIX_some_string3 string11 string12
string13 string14 PREFIX_some_string4 string15 string16

我只想将 PREFIX_some_string 作为一个整体提取出来

PREFIX_some_string1
PREFIX_some_string2
PREFIX_some_string3
PREFIX_some_string4

命令是什么?

【问题讨论】:

  • PREFIX 是否一直在线上的同一位置?如果不编辑您的帖子并给出更正确的示例。

标签: regex linux bash shell sed


【解决方案1】:

你可以使用grep:

$ grep -o 'PREFIX[^ ]*' file
PREFIX_some_string1
PREFIX_some_string2
PREFIX_some_string3
PREFIX_some_string4

greps 匹配 PREFIX + 任何字符,直到找到空格。它只是打印匹配,因为我们在grep 中使用-o 选项:只打印匹配行的匹配(非空)部分,每个这样的部分都在单独的输出行上 .

【讨论】:

  • 喜欢 "grep -o" ,但我会更改命令 " grep -oP 'PREFIX_[^\s]+' " 以避免出现非预期的后缀。
  • 看起来不错。但是我们可以用任何特殊字符来分隔,而不仅仅是空格。
  • @Narain 你能举一些例子吗?最好使用具有代表性的完整示例输入来更新您的问题。
  • 使用 -P 标志将 perl 正则表达式与 grep 结合起来可能是可行的方法。无论如何最好的答案
【解决方案2】:
sed -n 's/.* \(PREFIX_[^ ]*\).*/\1/p' YourFile

假设空格 char 是字段/字符串分隔符,并且结构中没有其他 PREFIX_ 是可能的

sed -n 's/\([^ ]\{1,\} \{1,\}\)\{2\}\(PREFIX_[^ ]*\).*/\1/p' YourFile

更准确的版本只将 PREFIX_ 作为第三个字段

【讨论】:

    【解决方案3】:

    对于示例文件,这样可以:

    awk '/PREFIX/' RS=" " file
    PREFIX_some_string1
    PREFIX_some_string2
    PREFIX_some_string3
    PREFIX_some_string4
    

    这将在该行的任何位置标记PREFIX 部分。

    【讨论】:

      【解决方案4】:

      只是一个 gawk 命令:

      $ gawk 'match($0, "(PREFIX_[^[:blank:]]+)", a) {print a[1]}' file
      

      【讨论】:

      • PREFIX_String 可以在任何位置。
      【解决方案5】:

      使用剪切命令的另一种解决方案
      剪切:
      -d 分隔符作为空格
      -f 要打印的列

      $ cut -d " " -f3 sample.txt
      

      PREFIX_some_string1
      PREFIX_some_string2
      PREFIX_some_string3
      PREFIX_some_string4

      【讨论】:

      • 在另一个答案中查看OPs 评论。 PREFIX_String can be at any location. – Narain