我需要帮助。我有一个文件,例如
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
这是一个非常基本的脚本,可让您遵循每条指令。它可以被大大浓缩。