Regex 如何在匹配之前删除行?

Regex 如何在匹配之前删除行?,regex,bash,sed,awk,Regex,Bash,Sed,Awk,我使用以下脚本删除与单词匹配的行之前的所有行: str=' 1 2 3 banana 4 5 6 banana 8 9 10 ' echo "$str" | awk -v pattern=banana ' print_it {print} $0 ~ pattern {print_it = 1} ' 它返回: 4 5 6 banana 8 9 10 但是我也想包括第一场比赛。这是所需的输出: banana 4 5 6 banana 8 9 10 我怎么能这样做?你对另一个命令有

我使用以下脚本删除与单词匹配的行之前的所有行:

str='
1
2
3
banana
4
5
6
banana
8
9
10
'

echo "$str"  | awk -v pattern=banana '
  print_it {print} 
  $0 ~ pattern {print_it = 1}
'
它返回:

4
5
6
banana
8
9
10
但是我也想包括第一场比赛。这是所需的输出:

banana
4
5
6
banana
8
9
10
我怎么能这样做?你对另一个命令有更好的想法吗? 我也尝试过
sed'0,/^banana$/d'
,但它似乎只适用于文件,我想将其用于变量

我怎样才能在比赛前用awk获得所有的线路? 我是说。对于正则表达式中的香蕉,这将是输出:

1
2
3

只需反转
awk
中的命令即可:

echo "$str"  | awk -v pattern=banana '
  $0 ~ pattern {print_it = 1}   <--- if line matches, activate the flag
  print_it {print}              <--- if the flag is active, print the line
'
echo“$str”| awk-v模式=香蕉'
$0~图案{print_it=1}

你应该做你想做的
-n
默认情况下指示sed不打印任何内容,
p
命令指定应打印所有寻址行。这将在流上工作,与awk解决方案不同,因为这需要整行完全匹配“banana”,而您的awk解决方案只要求字符串中包含“banana”,但我复制了您的sed示例。不确定“将其与变量一起使用”是什么意思。如果您的意思是希望字符串“banana”位于变量中,则可以轻松地执行
sed-n”/$variable/,\$p“
(注意双引号和转义的
$
)或
sed-n”/^$variable\$/,\$p“
sed-n”/^$variable”$/,$p'
。您也可以像使用awk一样使用“$str”| sed-n'/banana/,$p'

这个
awk
应该:

echo "$str" | awk '/banana/ {f=1} f'
banana
4
5
6
banana
8
9
10
如果不想保留匹配的行,则可以使用

cat in.txt | sed "0,/banana/d"

好了,就这样!谢谢你的解释!:)对不起,我无意中点击了其他答案。:)不,一点问题也没有:)我也认为其他答案更短,但我只是根据你的原始脚本发布的。另外,请注意,
-v pattern=“banana”
允许您更改模式,甚至使用
-v pattern=$bash\u var
从bash变量中指定模式。您能告诉我如何在不包含它的情况下获得匹配后的行吗?谢谢!:)@你可以使用
echo“$str”| awk'/banana/{exit}{print}'
谢谢!最简单的!
cat in.txt | awk "/banana/,0"
cat in.txt | sed "0,/banana/d"