bash,根据grep获取由2个字符串限制的文件部分

bash,根据grep获取由2个字符串限制的文件部分

这是输入文件(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指定单词边界。它会将其包围的所有字符作为一个整体单词进行匹配,从而防止在文件中匹配部分匹配字符的单词(即,不多不少的精确单词)。

相关内容