【问题标题】:Grep with regex expression带有正则表达式的 Grep
【发布时间】:2020-02-18 17:43:23
【问题描述】:

我需要第四个和第五个“|”之间的内容在以FHEAD 开头的所有行上。目标是应用 grep 中的正则表达式来读取文件。

我有这个表达式返回“|”之间的所有内容

(?<=\|)(.*?)(?=\|)

下面示例中的目标是返回

1047
8401-

FHEAD|1|PRMPC|20200217103050|1047|S
TMBPE|FHEAD|2|MOD
FHEAD|3|8401|230008|8401-|8401-Dcto|8401-Dcto 10FHEAD|1|235211|20190206000001|20190402235959|2||1||8||
TPGRP|4|240184
TGLIST|5|235213||||FHEAD
TLITM|6|101029605
TLITM|7|FHEAD101052978

有人可以帮助我吗?

提前致谢

【问题讨论】:

  • 你真的必须使用grep吗? cutawk 会容易得多。
  • 预期输出是什么?是的,awk 是更好的工具。
  • 我有几个文件,需要打开并阅读文件才能找到上面的内容。
  • @RCLFA,正如 anubhava 先生在这里提到的那样,如果您将在代码标签中的问题中发布您的预期输出,那么我们可以更好地理解您的问题,所以请用完整的细节编辑您的问题,让我们那就知道了。
  • 很抱歉,我刚开始在这里提出疑问。我想我解决了这个问题是为了更清楚。

标签: regex shell grep sh


【解决方案1】:

在以FHEAD 开头的行上打印第五个字段(非空)的内容:

awk -F'|' '$1=="FHEAD" && $5!=""{print $5}' file

【讨论】:

  • 是否可以添加仅以FHEAD 开头的行?
  • @RCLFA 你认为$1=="FHEAD" 会做什么?
【解决方案2】:
awk -F '|' '$5=="1047" || $5=="8401-"{ print $0 }"  inputfile.txt

上面会在输入文件“inputfile.txt”的第五列找到“1047”或“8401”

grep -E "\|1047\||\|8401-\|" inputfile.txt

上面将使用 grep 执行相同的操作(但这将不限于第 5 列。

编辑: 我一定错过了'以FHEAD开头'....

awk -F\| '/^FHEAD/{ print $5 }'  inputfile.txt

或使用 grep

grep -e '^FHEAD|\(.[^|]*|\)\{3\}\(.[^|]*\)' -o inputfile.txt | grep  '.[^|]*|*' -o | grep -v '|$'

grepcut 的组合:

grep -e '^FHEAD' inputfile.txt | cut -d'|' -f 5

【讨论】:

  • 适用于这个例子。但如果我在同一位置应用其他内容,它不再有结果。但是感谢您的帮助
  • 这不会查找问题中指定的以FHEAD 开头的行。
  • 10478401- 只是这个例子,它们并不是他一直在寻找的特定值。
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多