首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grep:将文件中的字符串与另一个字符串进行比较

grep:将文件中的字符串与另一个字符串进行比较
EN

Stack Overflow用户
提问于 2015-11-06 12:02:28
回答 2查看 97关注 0票数 0

我有一个需要与字符串进行比较的文件路径列表:

代码语言:javascript
复制
git_root_path=$(git rev-parse --show-toplevel)
list_of_files=.git/ForGeneratingSBConfigAlert.txt
cd $git_root_path
echo "These files needs new OSB config:"
while read -r line
do
    modfied="$line"
    echo "File for compare: $modfied"
        if grep -qf  $list_of_files" $modfied"; then
            echo "Found: $modfied"
        fi
done < <(git status -s | grep -v " M" | awk '{if ($1 == "M") print $2}')

$modified -是存储文件路径的字符串变量。

模式文件示例:

代码语言:javascript
复制
SVCS/resources/
SVCS/bus/projects/busCallout/
SVCS/bus/projects/busconverter/
SVCS/bus/projects/Resources/  (ignore .jar)
SVCS/bus/projects/Teema/
SVCS/common/
SVCS/domain/
SVCS/techutil/src/
SVCS/tech/mds/src/java/fi/vr/h/service/tech/mds/exception/
SVCS/tech/mds/src/java/fi/vr/h/service/tech/mds/interfaces/
SVCS/app/cashmgmt/src/java/fi/vr/h/service/app/cashmgmt/exception/
SVCS/app/cashmgmt/src/java/fi/vr/h/service/app/cashmgmt/interfaces/
SVCS/app/customer/src/java/fi/vr/h/service/app/customer/exception/
SVCS/app/customer/src/java/fi/vr/h/service/app/customer/interfaces/
SVCS/app/etravel/src/java/fi/vr/h/service/app/etravel/exception/
SVCS/app/etravel/src/java/fi/vr/h/service/app/etravel/interfaces/
SVCS/app/hermes/src/java/fi/vr/h/service/app/hermes/exception/
SVCS/app/hermes/src/java/fi/vr/h/service/app/hermes/interfaces/
SVCS/app/journey/src/java/fi/vr/h/service/app/journey/exception/
SVCS/app/journey/src/java/fi/vr/h/service/app/journey/interfaces/
SVCS/app/offline/src/java/fi/vr/h/service/app/offline/exception/
SVCS/app/offline/src/java/fi/vr/h/service/app/offline/interfaces/
SVCS/app/order/src/java/fi/vr/h/service/app/order/exception/
SVCS/app/order/src/java/fi/vr/h/service/app/order/interfaces/
SVCS/app/payment/src/java/fi/vr/h/service/app/payment/exception/
SVCS/app/payment/src/java/fi/vr/h/service/app/payment/interfaces/
SVCS/app/price/src/java/fi/vr/h/service/app/price/exception/
SVCS/app/price/src/java/fi/vr/h/service/app/price/interfaces/
SVCS/app/product/src/java/fi/vr/h/service/app/product/exception/
SVCS/app/product/src/java/fi/vr/h/service/app/product/interfaces/
SVCS/app/railcar/src/java/fi/vr/h/service/app/railcar/exception/
SVCS/app/railcar/src/java/fi/vr/h/service/app/railcar/interfaces/
SVCS/app/reservation/src/java/fi/vr/h/service/app/reservation/exception/
SVCS/app/reservation/src/java/fi/vr/h/service/app/reservation/interfaces/
kraken_test.txt
namaker_test.txt
shmaker_test.txt

我需要比较文件搜索模式和字符串,是否可以使用grep?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-06 12:41:43

这应该是可行的:

代码语言:javascript
复制
git status -s | grep -v " M" | awk '{if ($1 == "M") print $2}' | \
grep --file=.git/ForGeneratingSBConfigAlert.txt --fixed-strings --line-regexp
  • awk输出直接传输到grep,完全避免了while循环。在大多数情况下,您会发现实际上不需要在其中打印调试消息等等。
  • --file接受一个带有一个模式的文件来匹配每一行。
  • --fixed-strings避免将模式中的任何字符视为特殊字符。
  • --line-regexp锚定模式,以便只有当完整的输入行与其中一个模式匹配时,它们才匹配。

所有这些,你能澄清你到底想要做什么吗?

票数 0
EN

Stack Overflow用户

发布于 2015-11-06 12:41:53

我不确定我是否理解整体逻辑,但我立即想到了一些建议。

  • 在绝大多数情况下,您可以避免grep | awk
  • 在循环中一次在一行上有一个while循环,它是一个反模式。您可能只想在整个输入上运行一个grep

你的问题仍将受益于对你真正想要完成的事情的解释。

代码语言:javascript
复制
cd "$(git rev-parse --show-toplevel)"
git status -s | awk '!/ M/ && $1 == "M" { print $2 }' |
grep -Fxf .git/ForGeneratingSBConfigAlert.txt

我试着想出一种方法来补充你的人类可读的废话,但是再想一想,这个程序也许没有它会更好。

-x选项grep可能是错误的,这取决于您真正希望实现什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33566403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档