检查文件是否在bash中包含多行字符串

时间:2018-12-23 00:29:10

标签: string bash macos grep bsd

背景

我正在编写一个函数,以附加到我的$HOME目录中名为.bash.local的文件中。

➡️.bash.local来自.bash_profile

但是,我想有条件地附加到.bash.local ,并且仅当文件已经包含$BASH_CONFIGS的内容时。< / p>

注意事项

我选择的操作系统是MacOS Mojave,因此某些版本的命令行应用程序将有所不同(例如,Mac上的grepBSD grep,而不是GNU grep)。

⚠️append_to_bash_local()

append_to_bash_local() {
    local LOCAL_BASH_CONFIG_FILE="$HOME"/.bash.local

    declare -r BASH_CONFIGS="
# TOOL_NAME - TOOL_DESCRIPTION.
# Add tool configurations here
"

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    # If needed, add the necessary configs in the
    # local shell configuration file.

    if ! grep "^$BASH_CONFIGS" < "$LOCAL_BASH_CONFIG_FILE" &> /dev/null; then
        # this block never runs, even if the contents of $BASH_CONFIG
        # are NOT present in $HOME/.bash.local
    fi

}

2 个答案:

答案 0 :(得分:1)

您很近。无论如何,小的修补程序:

  • 使用零分隔的grep -Z将模式与换行符匹配。如果考虑到这一点,它可能有点笨拙,但每次都能使用。
  • 使用-q进行grep使其静音。
  • 不要将文件输入stdin到grep,只需告诉grep文件名即可。
  • 检查文件是否存在

append_to_bash_local() {
     local LOCAL_BASH_CONFIG_FILE="$HOME"/.bash.local
     declare -r BASH_CONFIGS="
# TOOL_NAME - TOOL_DESCRIPTION.
# Add tool configurations here
"
    if
           # if a file does not exists
           [ ! -e "$LOCAL_BASH_CONFIG_FILE" ] ||
           # if it doesn't have the content of BASH_CONFIGS
           ! grep -q -z "$BASH_CONFIGS" "$LOCAL_BASH_CONFIG_FILE"; then
        echo appending
        echo "$BASH_CONFIGS" >> "$LOCAL_BASH_CONFIG_FILE"
    else
        echo not appending
    fi

}

答案 1 :(得分:0)

@kamil-cuk的帮助下,我得以创建append_to_bash_local()的改进版本。

⚠️请注意,由于我在MacOS Mojave上并且默认情况下同时安装了BSD-grepBSD-sed并且没有安装GNU-grepGNU-sed,所以我被迫为使用ASCII NUL字符截断换行符寻找其他解决方案。幸运的是,@kamil-cuk使用了tr hacky 解决方案。

下面是append_to_bash_local()的改进版本。

⚠️append_to_bash_local()

  1. 首先,检查文件是否不存在[ ! -e "$LOCAL_BASH_CONFIG_FILE" ]
  2. 第二,将-qgrep配合使用以使其保持静音。
    • ➡️请确保在!的前面放置一个grep -q(不要),以确保输出的状态反转,因为我们正在检查文件是否不包含< / em> $BASH_CONFIGS的内容。
  3. 最后,请使用"$(<<<"$BASH_CONFIGS" tr '\n' '\01')" < <(less "$LOCAL_BASH_CONFIG_FILE" | tr '\n' '\01'),以便在$BASH_CONFIGS$LOCAL_BASH_CONFIG_FILE中使用ASCII NUL字符截断换行字符

    append_to_bash_local() {
    
        local LOCAL_BASH_CONFIG_FILE="$HOME"/.bash.local
    
        declare -r BASH_CONFIGS="
        # TOOL_NAME - TOOL_DESCRIPTION.
        # Add tool configurations here
        "
    
        # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
        # If needed, add the necessary configs in the
        # local shell configuration file.
    
        if [ ! -e "$LOCAL_BASH_CONFIG_FILE" ] || ! grep -q "$(<<<"$BASH_CONFIGS" tr '\n' '\01')" < <(less "$LOCAL_BASH_CONFIG_FILE" | tr '\n' '\01'); then
            printf '%s\n' "$BASH_CONFIGS" >> "$LOCAL_BASH_CONFIG_FILE"
        fi
    
    }