带有换行符的 grep -v 未按预期运行

grep -v with newlines not behaving as expected

我正在尝试为 git 创建一个预提交触发器,我必须使用 bin/sh 以获得最大的兼容性,所以请继续使用 sh(不是 bash等)

我不是 Unix 开发人员,所以这里可能有一些我没有掌握的非常基础的东西,但我似乎无法发现它。

我在一个变量中有一个文件列表。我想删除那些带有某些后缀的。

我认为有用的东西,在这里确实有用:https://www.online-utility.org/text/grep.jsp

输入正则表达式:^.+(\.auto\.sql|\.sln)$

src/blah/auto/star.LOAD_DimBrandDataLevels.auto.sql
src/blah/auto/star.LOAD_DimBrandDataLevels_FROM_Mds_mdm_BrandDataConfidence.auto.sql
src/blah/Blah.sln
src/blah/Some Other File.sql

Invert Match (Display Non-Matching Lines)

正确returns

src/blah/Some Other File.sql

但是当我将它放入 sh 脚本时它不起作用(我正在使用 https://www.jdoodle.com/test-bash-shell-script-online/

#!/bin/sh
files="src/blah/auto/star.LOAD_DimBrandDataLevels.auto.sql
src/blah/auto/star.LOAD_DimBrandDataLevels_FROM_Mds_mdm_BrandDataConfidence.auto.sql
src/blah/Blah.sln
src/blah/Some Other File.sql"

printf "%s" "$files"
numfiles=$( printf '%s' "$files" | grep -c '$' )

printf "\n%s\n" $numfiles

#files=$( printf '%s' "$files" | grep -v "\.auto\.sql") # works but diesn't guarantee end of line
#printf "%s" "$files"

files=$( printf '%s' "$files" | grep -v "^.+(\.auto\.sql|\.sln)$") # doesn't work even though it should match
printf "%s" "$files"

returns

src/blah/auto/star.LOAD_DimBrandDataLevels.auto.sql
src/blah/auto/star.LOAD_DimBrandDataLevels_FROM_Mds_mdm_BrandDataConfidence.auto.sql
src/blah/Blah.sln
src/blah/Some Other File.sql
4
src/blah/auto/star.LOAD_DimBrandDataLevels.auto.sql
src/blah/auto/star.LOAD_DimBrandDataLevels_FROM_Mds_mdm_BrandDataConfidence.auto.sql
src/blah/Blah.sln
src/blah/Some Other File.sql
src/blah/auto/star.LOAD_DimBrandDataLevels.auto.sql
src/blah/auto/star.LOAD_DimBrandDataLevels_FROM_Mds_mdm_BrandDataConfidence.auto.sql
src/blah/Blah.sln
src/blah/Some Other File.sql
4
src/blah/auto/star.LOAD_DimBrandDataLevels.auto.sql
src/blah/auto/star.LOAD_DimBrandDataLevels_FROM_Mds_mdm_BrandDataConfidence.auto.sql
src/blah/Blah.sln

真的不确定发生了什么,已经用尽了多种途径。

希望有人能对如何解决这个问题有所启发。谢谢

您需要使用-E, --extended-regexp:

$ printf "%s" "$files" | grep -v -E "^.+(\.auto\.sql|\.sln)$"
src/blah/Some Other File.sql