【问题标题】:Extract word after a known pattern in UNIX [duplicate]在UNIX中的已知模式之后提取单词[重复]
【发布时间】:2015-04-24 05:11:07
【问题描述】:

我有一个名为 in.txt 的文件,其中包含一大堆代码,但是我需要提取一个用户 ID,该用户 ID 保证为“EID:nmb685”形式,可能包含之前和/或之后的内容保证格式。我想使用 bash 脚本提取“nmb685”。我尝试了一些 grep 和 sed 的组合,但没有任何效果。

【问题讨论】:

  • 我看到“unix”标签,请报告您的 grep 版本。

标签: regex unix grep pattern-matching


【解决方案1】:

如果你的 grep 不支持 -p 但支持 -o,你可以结合 grep 和 awk。

grep -o 'EID:\w\+' file|awk -F':' '{print $2}'

虽然可以单独用awk来完成,但是这样更直接。

【讨论】:

  • 肯特,你是救世主。效果很好。
【解决方案2】:

如果你的grep支持-P,perl-regexp参数,你可以使用这个。

grep -oP 'EID:\K\w+' file

【讨论】:

    【解决方案3】:

    ID 后面输出的是什么?有什么一致的东西可以匹配吗?

    如果您知道可以使用的用户 ID 的长度:

    grep "EID:......" in.txt > out.txt
    

    或者如果你不这样做(检查所有 char/num 后跟空格,前面是 EID:)

    grep "EID:[A-Za-z0-9]* " in.txt > out.txt
    

    【讨论】:

      【解决方案4】:

      不是很优雅,但这很有效:

      grep "EID:" in.txt | sed 's/\(.*\EID:......\).*/\1/g' | sed 's/^.*EID://'
      
      1. 选择所有带有子字符串“EID:”的行
      2. 删除“EID:”后的所有内容加上 6 个字符
      3. 删除“EID:”之前(包括)“EID:”之前的所有内容

      【讨论】:

      • 如果一行包含多个模式,如EID:foo EID:bar,这可能会出现问题。但是 OP 没有提到这一点,所以它可能也可以。
      猜你喜欢
      • 2021-08-30
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多