带有换行符的 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
- 匹配非行尾标记有效,但行尾标记无效。
- 但是 -E 工作正常并且只找到我不想要的行
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
我正在尝试为 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
- 匹配非行尾标记有效,但行尾标记无效。
- 但是 -E 工作正常并且只找到我不想要的行
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