![bash,根据grep获取由2个字符串限制的文件部分](https://linux22.com/image/1023160/bash%EF%BC%8C%E6%A0%B9%E6%8D%AEgrep%E8%8E%B7%E5%8F%96%E7%94%B12%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%99%90%E5%88%B6%E7%9A%84%E6%96%87%E4%BB%B6%E9%83%A8%E5%88%86.png)
这是输入文件(3 个部分,除以##
)。
## some info 1
aaa
bbb
ccc
## some info 2
ddd
eee
fff
## some info 3
ggg
hhh
iii
我需要根据脚本后面的参数的搜索词获取文件的一个或多个部分。
例子。
在
find-part-of-file.sh hhh aaa
出去
## some info 1
aaa
bbb
ccc
## some info 3
ggg
hhh
iii
$1
还有一个小问题,可以在别名中使用超过 1 个变量.bashrc
吗?因为当我使用例如带有更多变量的脚本的别名时,别名“连接”两个输入到最后一个变量。
alias test-env="echo var1 = $1 , var2 = $2"
hosek@dell:~$ test-env aaa
var1 = , var2 = aaa
hosek@dell:~$ test-env aaa bbb
var1 = , var2 = aaa bbb
hosek@dell:~$
答案1
您根本不能将位置参数与别名一起使用;您的示例仅出现分配一个值,而实际上$1
和$2
都扩展为空值,然后附加任何“参数”,您可以使用来验证set -x
:
$ set -x
$ alias test-env="echo var1 = $1 , var2 = $2"
+ alias 'test-env=echo var1 = , var2 = '
$ test-env aaa
+ echo var1 = , var2 = aaa
var1 = , var2 = aaa
如果要传递参数,请改用 shell 函数:
unalias test-env
test-env () { echo "echo var1 = $1 , var2 = $2"; }
对于您的主要问题,我建议在“段落模式”下使用 awk,而不是使用 GNU awk 的 grep ex.:
$ gawk -v RS= -v pats='aaa|hhh' '$0 ~ pats {ORS=RT; print}' file
## some info 1
aaa
bbb
ccc
## some info 3
ggg
hhh
iii
答案2
如果必须使用grep
,可以这样做:
grep -Pzo "##([^#]+)(\baaa\b|\bhhh\b)([^#]+)" file
这将从每个
##
匹配aaa
或开始hhh
,并在下一个匹配之前打印整个匹配块#
。-Pzo
将启用使用 Perl 兼容正则表达式-P
,启用多行,-z
并仅打印匹配的部分-o
。\b
指定单词边界。它会将其包围的所有字符作为一个整体单词进行匹配,从而防止在文件中匹配部分匹配字符的单词(即,不多不少的精确单词)。