我的问题是决定首先出现的三个模式,并在第一个模式之前删除everthing,同样删除最后一个模式后的everthing。
我知道要删除以上模式下面的everthing可以使用::
sed -n'/ pattern /,$ p'输入
grep -E -m1“pattern1 | pattern2 | pattern3”将打印包含第一个模式的行,我想我必须将此命令的输出提供给某些sed变量但不知道如何这样做。
1.PATTERN1
2.PATTERN2
3.PATTERN3
Line1这是一个示例行,例如没有任何意义请忽略
Line2仅用于给出示例PATTERN2以使我的查询对所有人清楚
Line3这是一个示例行,例如没有任何意义请忽略
Line4仅用于给出示例pattern1以使我的查询对所有人清楚
Line5这是一个示例行,例如没有任何意义请忽略
Line6仅用于给出示例pattern1以使我的查询对所有人清楚
Line7这是一个示例行,例如没有任何意义请忽略
Line8仅用于给出示例pattern2以使我的查询对所有人都清楚
Line9这是一个示例行,例如没有任何意义请忽略
Line10仅用于给出示例pattern3以使我的查询对所有人都清楚
Line11仅用于给出一个示例PATTERN2,以使我的查询对所有人都清楚
Line12仅用于给出示例pattern1以使我的查询对所有人都清楚
Line13仅用于给出一个示例pattern3以使我的查询清楚所有
Line14仅用于举例说明我的查询清除所有
期望的输出:
如果第一个模式是PATTERN2,而pattern3是三个模式中的最后一个模式,那么下面的输出是希望输出:
Line2仅用于给出示例PATTERN2以使我的查询对所有人清楚
Line3这是一个示例行,例如没有任何意义请忽略
Line4仅用于给出示例pattern1以使我的查询对所有人清楚
Line5这是一个示例行,例如没有任何意义请忽略
Line6仅用于给出示例pattern1以使我的查询对所有人清楚
Line7这是一个示例行,例如没有任何意义请忽略
Line8仅用于给出示例pattern2以使我的查询对所有人都清楚
Line9这是一个示例行,例如没有任何意义请忽略
Line10仅用于给出示例pattern3以使我的查询对所有人都清楚
Line11仅用于给出一个示例PATTERN2,以使我的查询对所有人都清楚
Line12仅用于给出示例pattern1以使我的查询对所有人都清楚
Line13仅用于给出示例pattern3以使我的查询对所有
答案 0 :(得分:1)
sed是单行上简单替换的优秀工具,但对于其他任何东西,只需使用awk。您没有提供任何样本输入或预期输出或任何有关“模式”的含义的信息,因此这是一个未经测试的猜测,但它可能对您有用:
awk -v pats='pattern1|pattern2|pattern3' '
{ data[NR] = $0 }
$0 ~ pats { if (start) end=NR; else start=NR }
END{ for (i=start; i<=end; i++) print data[i] }
' file
评论版:
awk -v pats='pattern1|pattern2|pattern3' # or-separated list of patterns to be matched
{ data[NR] = $0 } # save current line in an array indexed by line number
$0 ~ pats { # IF the current line matches any of the target patterns THEN
if (start) # IF the start line number is already recorded THEN
end=NR; # remember the current line number as the last one on which one of the patterns exists
else # ELSE
start=NR # remember the current line number as the first one on which one of the patterns exists
# ENDIF
} # ENDIF
END{ # Once all of the file has been read into the array
for (i=start; i<=end; i++) # Loop through the array, starting at the first line on which one of the patterns was found
# and ending on the last line on which one of the patterns was found
print data[i] # Print the contents of the array at each line number in the loop.
}
' file
答案 1 :(得分:1)
正如您所示,这将在第一次出现之前删除任何内容:
sed -n '/pattern/,$p' file
所以我们可以得到它的输出,反转它并应用 程序再次。然后反转 的输出,我们在第一个和最后一个匹配之间有所有文本:
seq 10 | sed -n '/4\|7/,$p' | tac | sed -n '/4\|7/,$p' | tac
4
5
6
7
我们可以把它放到一个函数中:
after() { sed -n '/'"$1"'/,$p'; }
between() { after "$1" | tac | after "$1" | tac; }
seq 10 | after '4\|7'
echo ===
seq 10 | between '4\|7'
4
5
6
7
8
9
10
===
4
5
6
7