bash - 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"
这可能是脚本如何开始的?没有把握。我真的很感激任何帮助。
解决方案
输入行应该是line5或者LOUIS:line5,无所谓。
输入是电影剧本的某一行
输出是最近的玛丽线(玛丽线应该在某条线之前,而不是之后)
- 打印所有行,直到匹配模式。使用 sed 很简单。
- 用 tac 反转。
- 打印 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 在保持空间中的行,并在输入的最后一行打印保持空间。由于保留空间将保留最后一条玛丽线,所以应该没问题。(脚本也可以通过q
before加速$
,所以它不必解析整个文件):
sed -n '1,/'"$input"'/{ /MARY:/{ h } }; ${ g;p }' play.txt
推荐阅读
- flutter - Start slide-in animation on button press flutter
- python - 检测/删除职位发布中的样板文本 [Python]?
- javascript - 获取数据并使用状态挂钩
- java - Selenium 测试返回与 chrome 和 egde 相同的错误 java.net.SocketException
- sql-server - AAD 和 DB 用户的混合身份验证
- vhdl - Quartus 网表优化在状态机中丢失寄存器扇出
- python - 如何根据几列中的指定条件选择数据框中的行?
- mysql - 根据不同列的值更新列的数据
- wordpress - 在 Wordpress 自定义帖子类型管理表单中添加动态更改的下拉列表
- python - 如何快速检查域是否存在?