スクリプトが空白で区切られた文字列を表示しない理由を理解できません。シェルスクリプトで空白を含む配列に行を分割する方法
これは私のコードです:
While read -r row
do
line = ($row)
for word in $line
do
echo ${word[0]}
done
done < $1
はラインがこの作品は、罰金
i want the output to be "add"
スクリプトが空白で区切られた文字列を表示しない理由を理解できません。シェルスクリプトで空白を含む配列に行を分割する方法
これは私のコードです:
While read -r row
do
line = ($row)
for word in $line
do
echo ${word[0]}
done
done < $1
はラインがこの作品は、罰金
i want the output to be "add"
While read -r row
これはWhile
というコマンドを実行しようと、あなたはおそらくそのためにエラーが発生します。シェルキーワードはwhile
です。
do
line = ($row)
これは、コマンドを実行しようとしますが、あなたが何をしたいのGNU coreutilsの(line - read one line
)からプログラムである、line
と呼ばれる、おそらくありません。シェル内の割り当てはでなく、には等号の周りに空白が必要です。
その割り当てが機能する場合は、line
という配列が作成されます。
for word in $line
名前だけで配列を参照すると、最初の項目に展開されるため、ここではループは使用できません。
do
echo ${word[0]}
そしてここでは、インデックスはword
は単一の値ではなく配列であることを行っているので、非常に便利ではありません。 $row
が*
のようなグロブ文字が含まれている場合、彼らはマッチするファイル名に展開されますけれども
while read -r row ; do
words=($row);
echo "${words[0]}"
done
:私はあなたが欲しいものを疑う
はこれです。
これが良いだろう。
read -r -a words
echo "${words[0]}"
または単に
read -r line
echo "${line%% *}" # remove everything after the first space
を "$ S0 $ S0 $ t1に追加" であると言う:
while read -r row
do
echo $row | awk '{print $1}'
done
while read -r row
を求めますユーザの入力とそれをrow
変数に格納すると、awk '{print $1}'
はユーザ入力の最初の単語のみを表示します。
私は、ユーザからの入力を取っていないよいないが、行が別のファイルから来ます。ファイルが引数です。 –
各トークンを別々の行にしたいですか?単にsed
を使用しないのはなぜですか?その後、
$ echo "1 2 3 hi" | sed -r 's/[ \t]+/\n/g'
1
2
3
hi
あなたは各行の最初の単語をしたい場合は、:|とちょうどSEDへのパラメータとしてファイル名を与える
$ echo "1 2 3 hi" | sed -r 's/^([^ \t]+).+/\1/'
1
そのファイルであれば、その後、「エコー...」を削除:
$ sed -r 's/^([^ \t]+).+/\1/' file.txt
または単に 'read -r word _; echo "$ word" ' –