1

会社で使用している CMS の複数のチェックと検索を実行する bash スクリプトを修正しようとしています。ユーザーが特定のマクロ呼び出しを検索できるようにする関数を実装しようとしています。関数は、呼び出しを含むすべてのファイル、マクロが呼び出された行、およびマクロ呼び出しの実際のコードを返します。出力をフォーマットするために for ループを使用しているという事実によって、私が持っているものは台無しになっているようです。私が取り組んでいるスクリプトのスニペットは次のとおりです。

    elif [ "$choice" = "2" ]
then
    echo -e "\n What macro call are we looking for $name?"
    read macrocall
    for i in $(grep -inR "$macrocall" $sitepath/templates/macros/); do 
    file=$(echo $i | cut -d\: -f1 | awk -F\/ '{ print $NF }')
    line=$(echo $i | cut -d\: -f2)
    calltext=$(echo $i | cut -d\: -f3-)
    echo -e "\nFile: $file"
    echo -e "\nLine: $line"
    echo -e "\nMacro Call from file: $calltext"
    done
fi

現在のスクリプトは、最初のいくつかのフィールドをスペースが空くまで実行し、その後すべてがおかしくなりました。for ループ区切り文字を grep の各結果にする方法を知っている人はいますか? どんな提案も役に立ちます。さらに情報が必要な場合はお知らせください。ありがとう!

4

2 に答える 2

2

これを行う正しい方法は、次のようになります。

printf "\n What macro call are we looking for %s?" "$name"
read macrocall

# ensure globbing is off and set IFS to a newline after saving original values
oSET="$-"; set -f; oIFS="$IFS"; IFS=$'\n'

awk -v macrocall="$macrocall" '
    BEGIN    { lc_macrocall = "\\<" tolower(macrocall) "\\>" }
    tolower($0) ~ lc_macrocall {
        file=FILENAME
        sub(/.*\//,"",file)
        printf "\n%s\n", file
        printf "\n%d\n", FNR
        printf "\nMacro Call from file: %s\n", $0
    }
' $(find "$sitepath/templates/macros" -type f -print)

# restore original IFS and globbing values
IFS="$oIFS"; set +f -"$oSET"

これにより、最初に要求されたファイル名にスペースが含まれる問題が解決されますが、ファイル名のグロブ文字やさまざまな典型的なecho問題も処理されます。

于 2013-08-05T11:44:31.073 に答える
1

この問題を回避するために、内部フィールドセパレーター$IFS(通常はスペース、タブ、および改行に設定されます) を改行のみに設定できます。

IFS="\n"
于 2013-08-05T03:43:19.207 に答える