パターンが一致する行の前に文字を追加する

パターンが一致する行の前に文字を追加する

以下を含む配列があります。

line number 1
line number 2
line number 3
line number 4
line number 5

その後、ユーザーに入力を求めます。

read userInput
echo $userInput

次に、私の配列の数であるユーザー入力を一致させようとします。

for i in "${!array[@]}";do
if [["${array[$i]}"="$userInput"]]
then
    echo "~"
    echo " $i"
fi
done

しかし、これはうまくいきません。希望の出力は次のとおりです。

4
line number 1
line number 2
line number 3
~line number 4
line number 5

誰でも私を助けることができますか?

ベストアンサー1

条件には[[ .. ]]演算子と値の周りにスペースが必要です。

[[ "${array[$i]}" = "$userInput" ]]
  instead of 
[["${array[$i]}"="$userInput"]]

(後者は単語として解釈され、シェルはその名前のコマンドを見つけようとします。)

また、${!array[@]}配列のインデックスが提供されます。スクリプトからindexを印刷したため、これが望むものかどうかはわかりませんが、出力例には配列echo $iに格納されている文字列が含まれているようです。特別なインデックスが必要ない場合はfor value in "${array[@]}"

その後、パターンの一部を一致させるには、パターンの前後のすべての項目を許可する必要があることをシェルに明示的に通知する必要があります([[ "$var" = *$pattern* ]]パターンの周りに引用符はありません)。 (望むよりここ)

だから少し説明すると、次のようになります。

A=("abc" "def" "ghi")
pat=e
for val in "${A[@]}"; do 
    [[ "$val" = *$pat* ]] && echo -n "~"
    echo "$val"
done

印刷

abc
~def
ghi

おすすめ記事