簡體   English   中英

檢查文件是否包含bash中的多行字符串

[英]Check if a file contains a multi-line string in bash

背景

我正在編寫一個函數來附加到我的$HOME目錄中名為.bash.local的文件。

➡️ .bash.local來自.bash_profile

但是,當且僅當文件尚未包含$BASH_CONFIGS .bash.local

要記住的事情

我選擇的操作系統是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

}

你很接近。 無論如何,小修復:

  • 使用零分隔的grep -Z將模式與換行符匹配。 如果你想到它,它有點老套,但每次都有效。
  • 使用-q grep 使其靜音。
  • 並且不要將文件輸入標准輸入到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 [[ "$(uname)" == "Linux" ]]; then
    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
        printf '%s\n' "$BASH_CONFIGS" >> "$LOCAL_BASH_CONFIG_FILE"
    else
        echo not appending
    fi

elif [[ "$(uname)" == "Darwin" ]]; then
    if 
            [ ! -e "$LOCAL_BASH_CONFIG_FILE" ] || 
            ! grep -q "$(<<<"$BASH_CONFIGS" tr '\n' '\01')" < <(
                less "$LOCAL_BASH_CONFIG_FILE" | tr '\n' '\01'
            ); then
        echo appending
        printf '%s\n' "$BASH_CONFIGS" >> "$LOCAL_BASH_CONFIG_FILE"
    else
       echo not appending
    fi
fi

}

@kamil-cuk的幫助下,我能夠創建一個改進版的append_to_bash_local()

⚠️ 請注意,因為我在MacOS Mojave上並且默認安裝了BSD-grepBSD-sed並且既沒有安裝GNU-grep也沒有安裝GNU-sed ,我被迫找到一個不同的解決方案來截斷換行符ASCII 空字符 值得慶幸的是, @kamil-cuk有一個使用trhacky解決方案。

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

⚠️ append_to_bash_local()

  1. 首先,檢查文件是否不存在[ ! -e "$LOCAL_BASH_CONFIG_FILE" ] [ ! -e "$LOCAL_BASH_CONFIG_FILE" ] .
  2. 其次,將-qgrep一起使用以使其保持靜默。
    • ➡️ 一定要放一個! (不)在grep -q的前面以確保輸出的狀態被反轉,因為我們正在檢查文件是否不包含$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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM