首页 > 解决方案 > Bash脚本:根据输入行的某些参数打印某行

问题描述

我对 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

解决方案


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

输入是电影剧本的某一行

输出是最近的玛丽线(玛丽线应该在某条线之前,而不是之后)

  1. 打印所有行,直到匹配模式。使用 sed 很简单。
  2. 用 tac 反转。
  3. 打印 Mary 行的第一个匹配项。简单的 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 在保持空间中的行,并在输入的最后一行打印保持空间。由于保留空间将保留最后一条玛丽线,所以应该没问题。(脚本也可以通过qbefore加速$,所以它不必解析整个文件):

sed -n '1,/'"$input"'/{ /MARY:/{ h } }; ${ g;p }' play.txt

推荐阅读