通过过滤器命令编辑svn特性

通过过滤器命令编辑svn特性,svn,shell,Svn,Shell,我想对svn属性值递归地应用一个过滤器(例如sed-e's/OLD/NEW/g') 首先,在单个目标上,我可以执行以下操作之一: svn-propget--strict-PROPNAME目标| sed-e's/OLD/NEW/g'| svn-propset-PROPNAME--file=-TARGET svn-propset-PROPNAME--file=svn-propget-R的输出不容易解析,但是svn-propget-v-R的输出很难解析,所以我决定运行一次并解析其输出 首先,我尝试了进

我想对svn属性值递归地应用一个过滤器(例如
sed-e's/OLD/NEW/g'

首先,在单个目标上,我可以执行以下操作之一:

  • svn-propget--strict-PROPNAME目标| sed-e's/OLD/NEW/g'| svn-propset-PROPNAME--file=-TARGET

  • svn-propset-PROPNAME--file=svn-propget-R
    的输出不容易解析,但是
    svn-propget-v-R
    的输出很难解析,所以我决定运行一次并解析其输出

    首先,我尝试了进程替换
    >(…)
    ,但如中所述,我无法强制执行或等待这些子进程的终止,因此输出消息非常混乱,尽管它确实有效。如中所述,我使用了协过程:

    #!/bin/bash
    set -o errexit -o pipefail
    
    if [ $# -le 2 ]; then
        echo "usage: $0 PROPNAME TARGET COMMAND [ARGS...]" >&2
        exit 1
    fi
    PROPNAME=$1; shift
    TARGET=$1; shift
    COMMAND=$1; shift
    
    cleanup_and_wait() {
        if [[ ${COPROC[1]} =~ ^[0-9]+$ ]]; then
            eval "exec ${COPROC[1]}<&-"
            wait $COPROC_PID
        fi
    }
    
    unset curr_target
    unset prev_line
    while IFS= read -r line; do
        case "$line" in
        "    "*)
            line=${line:4}
            if declare -p prev_line >/dev/null 2>&1; then
                echo "$prev_line" >&${COPROC[1]}
            fi
            prev_line=$line
            ;;
        "  "*)
            line=${line:2}
            if [ "$line" != "$PROPNAME" ]; then
                echo "Unexpected property: $line" >&2
            fi
            cleanup_and_wait
            coproc { "$COMMAND" "$@" | svn propset "$PROPNAME" --file=- "$curr_target"; } >&2
            unset prev_line
            ;;
        "Properties on '"*"':")
            line=${line%"':"}
            line=${line#"Properties on '"}
            curr_target=$line
            ;;
        esac
    done < <(svn propget --verbose --recursive "$PROPNAME" "$TARGET")
    cleanup_and_wait
    
    #/bin/bash
    设置-o errexit-o pipefail
    如果[$#-le 2];然后
    echo“用法:$0 PROPNAME目标命令[ARGS…]”>&2
    出口1
    fi
    PROPNAME=$1;转移
    目标=1美元;转移
    COMMAND=$1;转移
    清理和等待(){
    如果[${COPROC[1]}=~^[0-9]+$];则
    
    eval“exec${COPROC[1]}svn propget-R
    的输出不容易解析,但是svn propget-v-R的输出很难解析,所以我决定运行一次并解析其输出

    首先,我尝试了进程替换
    (…)
    ,但如中所述,我无法强制执行或等待这些子进程的终止,因此输出消息非常混乱,尽管它确实有效。因此,如中所述,我使用了协进程:

    #!/bin/bash
    set -o errexit -o pipefail
    
    if [ $# -le 2 ]; then
        echo "usage: $0 PROPNAME TARGET COMMAND [ARGS...]" >&2
        exit 1
    fi
    PROPNAME=$1; shift
    TARGET=$1; shift
    COMMAND=$1; shift
    
    cleanup_and_wait() {
        if [[ ${COPROC[1]} =~ ^[0-9]+$ ]]; then
            eval "exec ${COPROC[1]}<&-"
            wait $COPROC_PID
        fi
    }
    
    unset curr_target
    unset prev_line
    while IFS= read -r line; do
        case "$line" in
        "    "*)
            line=${line:4}
            if declare -p prev_line >/dev/null 2>&1; then
                echo "$prev_line" >&${COPROC[1]}
            fi
            prev_line=$line
            ;;
        "  "*)
            line=${line:2}
            if [ "$line" != "$PROPNAME" ]; then
                echo "Unexpected property: $line" >&2
            fi
            cleanup_and_wait
            coproc { "$COMMAND" "$@" | svn propset "$PROPNAME" --file=- "$curr_target"; } >&2
            unset prev_line
            ;;
        "Properties on '"*"':")
            line=${line%"':"}
            line=${line#"Properties on '"}
            curr_target=$line
            ;;
        esac
    done < <(svn propget --verbose --recursive "$PROPNAME" "$TARGET")
    cleanup_and_wait
    
    !/bin/bash
    设置-o errexit-o pipefail
    如果[$#-le 2];那么
    echo“用法:$0 PROPNAME目标命令[ARGS…]”>&2
    出口1
    fi
    PROPNAME=$1;移位
    目标=1美元;班次
    命令=$1;移位
    清理和等待(){
    如果[${COPROC[1]}=~^[0-9]+$];则
    eval“exec${COPROC[1]}