使用 sed 过滤数据

使用 sed 过滤数据

我需要帮助。我有一个文件,例如

sometext line 1
sometext line 2
SU0000 
ID
ID
ID
sometext line 3
sometext line 4
sometext line 5
sometext line 6
SU0000 
ID
ID
ID
sometext line 7
sometext line 8

我想过滤文本,以便输出

sometext line 2
SU0000 
ID
ID
ID
sometext line 6
SU0000 
ID
ID
ID

换句话说,我想要获取以 ID 开头的模式之前的行和模式之后的所有行。

我想在 sed 中执行此操作。有人可以帮忙吗?

答案1

你不能。这不是什么sed被设计用来做。

你可以这样做grep,如果ID是固定的。如果是变量,则需要更强大的工具,例如 bash 或 perl 脚本。

如果 ID 出现的次数是固定的(例如 3),则以下命令

  grep -B 1 -A 3 SU0000 filename.txt

将会满足您的要求。

编辑:

如果 SU0000 的出现次数不固定,则以下脚本将为您解决问题,其中要解析的文件称为“数据”。将其更改为最适合您的值。

  #!/bin/bash

  I_INSIDE=0
  PREVIOUS_LINE=""

  while read line; do
    echo $line | grep -e SU0000 2>&1 1>/dev/null
    if [ $? == 0 ]; then
            echo $PREVIOUS_LINE
            echo $line
            I_INSIDE=1
            PREVIOUS_LINE=$line
            continue
    fi
    echo $line | grep -e ID 2>&1 1>/dev/null
    if [ $? == 0 -a $I_INSIDE == 1 ]; then
            echo $line
    else
            I_INSIDE=0
    fi
    PREVIOUS_LINE=$line

  done < data

这是一个非常基本的脚本,可让您遵循每条指令。它可以被大大浓缩。

相关内容