Git 在bash脚本中按模式筛选行

Git 在bash脚本中按模式筛选行,git,bash,sh,Git,Bash,Sh,我有两个变量,一个是文本变量,另一个是模式变量。我想过滤掉线条,匹配的图案。我该怎么做 我的脚本是这样的 # get ignore files list IGNORE=`cat ignore.txt` # get changed files list CHANGED=`git diff --name-only $LAST_COMMIT HEAD` # remove files, that should be ignored from change list for IG in $IGNORE

我有两个变量,一个是文本变量,另一个是模式变量。我想过滤掉线条,匹配的图案。我该怎么做

我的脚本是这样的

# get ignore files list
IGNORE=`cat ignore.txt`

# get changed files list
CHANGED=`git diff --name-only $LAST_COMMIT HEAD`

# remove files, that should be ignored from change list
for IG in $IGNORE; do
    echo $CHANGED
    $CHANGED=`cat $CHANGED | grep -v $IG`
done

您可以直接向grep提供模式文件

# get changed files list and remove files that should be ignored
CHANGED=$(git diff --name-only $LAST_COMMIT HEAD | grep -vf ignore.txt)
echo $CHANGED
(我建议使用
$()
而不是反勾号。)


顺便说一下,这行:

$CHANGED=`cat $CHANGED | grep -v $IG`
应该是这样的:

CHANGED=`echo $CHANGED | grep -v $IG`

如果您打算保留它。

为了避免产生进程,您可以执行
IGNORE=$(
是,谢谢。将模式文件直接提供给grep是个好主意。
# Disable globbing
set -f
# Collect variables
IGNORE=$(cat ignore.txt)
CHANGED=$(...)

# Apply each pattern in turn
for pattern in $IGNORE
do
    # Reset the current list of candidates
    CANDIDATES=
    for candidate in $CHANGED
    do
        # Apply the pattern
        CANDIDATES="$CANDIDATES ${candidate%$pattern}"
    done
    # Update the CHANGED list
    CHANGED=$CANDIDATES
done