Bash脚本:根据基于输入行的某些参数打印特定行

问题描述 投票:0回答:1

我对bash还是很陌生。我要实现的是用一条输入线根据某些参数打印一条线。

这是我能想到的最好的例子。假设我有一个电影剧本。它由五个互相交谈的人组成,我们称他们为Mary,Laura,Joe,Michael和Louis。现在:我听到一行路易斯。我想找到与我刚刚听到的最接近的Mary线(并且必须“向上”,它必须在Louis的线之前,而不是之后)。电影脚本的设置方式如下:

MARY: line1
LAURA: line2
JOE: line3
MICHAEL: line4
LOUIS: line5

好,现在

#!/bin/bash
echo Type Marys line:
read marysline
grep -rIH "$marysline"

这是也许脚本如何开始?不确定。非常感谢您的帮助。

bash
1个回答
0
投票

输入行应该是line5或LOUIS:line5,它是无所谓的。

输入是电影脚本的某一行

输出是最接近的玛丽行(玛丽行应在特定行之前出现,而不是之后)

  1. 打印所有行直到匹配模式。 sed很简单。
  2. 与TAC反向。
  3. 打印玛丽线的第一场比赛。使用grep -m1即可简单

示例:

# recreate input
input="LOUIS: line5"
cat >play.txt <<EOF
MARY: line1
LAURA: lin2
JOE: line3
MICHAEL: line4
LOUIS: line5
EOF

# the script
# Print all the lines up until a pattern is matched.
sed -n '1,/'"$input"'/p' play.txt | 
# reverse order of lines
tac | 
# match the first Mery line
grep -m1 -i '^Mary:'
# or grep -m1 "^MARY:", no idea is non-sensitive match is intended

将输出:

MARY: line1

repl上测试

实际上,您可以在sed中完成所有操作。对于直到$input的行,请记住在保留空间中有Mary的行,并仅在输入的最后一行上打印保留空间。由于容纳空间将容纳玛丽的最后一行,因此应该没问题。 (也可以通过在q之前执行$来提高脚本的速度,因此它不必解析整个文件):

sed -n '1,/'"$input"'/{ /MARY:/{ h } }; ${ g;p }' play.txt
© www.soinside.com 2019 - 2024. All rights reserved.