我对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,它是无所谓的。
输入是电影脚本的某一行
输出是最接近的玛丽行(玛丽行应在特定行之前出现,而不是之后)
示例:
# 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