Bash:各配列メンバーの周りの引用符を削除する基本的な方法

Bash:各配列メンバーの周りの引用符を削除する基本的な方法

別のスクリプトから配列を読みました。" "一部のメンバーが空であるため、配列はすべての配列メンバーを配置する必要があります。

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
    echo ${vector[index]}
done

問題は、各出力行の周りに引用符があり、それを削除したいということです。

"red"
"blue"
"green"
""
"white"
"black"

次に変更する必要があります。

red
blue
green

white
black

または他のパイプラインベースの方法を使用しない方法を探していますawk。括弧の使用、その他の句読点の使用など、基本的な方法を使用して問題を解決したいと思います。trsed

答え1

これはうまくいくかもしれません:

in_file=./data
vector=($(./readdata.sh 0 $in_file))
for index in ${!vector[@]}
do
    echo ${vector[index]//\"/}
done

引用:http://www.tldp.org/LDP/abs/html/refcards.html#AEN22828

答え2

readdata.sh引用符を追加せずに改行で区切られたデータを生成すると、プログラムはより単純になり、強力になります。

現在のプログラムからの出力はreaddata.sh空白に分割されます(たとえば、"a b"結果は2つの配列要素となります"ab"。各結果ワードはワイルドカードパターンとして解釈されます(たとえば、"a * b"結果は"a現在のディレクトリのファイル名です)。そして最後にb")。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?詳細については。

Bashは改行で区切られたデータを読み取る非常に簡単な方法を提供します。mapfile内蔵。 bashはサブシェルでパイプの右側を実行するので、単に作成することはできず、./readdata.sh 0 "$in_file" | mapfile -t vector変数の使用をコマンドブロックに入れる必要があるか、プロセス置換を使用できます。

in_file=./data
mapfile -t vector < <(./readdata.sh 0 "$in_file")
for index in "${!vector[@]}"
do
  echo "$index: ${vector[index]}"
done

インデックスを使用せずに要素のみを使用する場合、配列を繰り返すより簡単な方法は次のとおりです。

for element in "${vector[@]}"
do
  echo "$element"
done

答え3

裏地はシングルライニングを好むので、

vector=("${vector[@]//\"/}")

テキスト置換は配列全体に適用できることを覚えておいてください。

答え4

「ハッキングされた」検索および交換ソリューションを回避するには、eval次の方法をお勧めします。

vector=( $(eval echo ${vector[@]}) )

これにより、シェルはそれを引用符付き引数として解釈して引用符をecho削除します。もちろん、上記の行はまだ空白の問題がありますが、ここで重要なのはを使用することですeval

関連情報