私の目標は、100行目をsedして文字列に変換し、文のデータを単語に分離することです
#!/bin/bash
fid=log.txt;
sentence=`expr sed -n '100p' ${fid}`;
for word in $sentence
do
echo $word
done
しかし、明らかにこれは失敗しました。
expr: syntax error
誰かが私が間違ったことを教えてください。以前は番号で機能していました。
この場合、 expr コマンドは必要ないと思います。expr は計算を行うために使用されます。何かのようなもの:
expr 1 + 1
これだけでいいです:
sentence=`sed -n '100p' ${fid}`;
ここexpr
では、 が有用な目的を果たしているようには見えません。もしそうであったとしてsed
も、ほとんどの状況では、コマンドを渡すことは有効でも有用でもありません。あなたはおそらくそれを取り出すべきです。
ただし、次のループにも問題があります。シェル スクリプト内の引用符で囲まれていない変数は、非常に頻繁にエラーになります。この場合、for
ループに渡すものを引用することはできません (引用符で囲まれた文字列に設定されたループ変数を使用して、ループが 1 回だけ実行されることになります)。引用符なしの文字列。したがって、文字列にたまたま が含まれていた場合*
、シェルはそれを現在のディレクトリ内のファイルのリストに展開します。
幸いなことに、これはすべて、わずかに複雑なsed
スクリプトで実行できます。
sed '100!d;s/[ \t]\+/\n/g;q' "$fid"
つまり、行番号が 100 でない場合は、この行を削除して次の行からやり直します。それ以外の場合は、100 行目です。一連の空白を改行に置き換えて (print)、終了します。
(バックスラッシュのエスケープ コードは普遍的に移植可能ではありません。また\t
、繰り返しもオプションの拡張機能です。セミコロンをコマンド セパレータとして嫌う亜種もあると思います。マニュアル ページを参照して実験し、他のすべてが失敗した場合は、おそらくに切り替えてください。 Awk または Perl.念のため、Mac OSX でも動作するバージョンを次に示します。\n
\+
sed
sed
sed '100!d
s/[ ][ ]*/\
/g;q' log.txt
角括弧内のものは、スペースと文字通りのタブです。Bash では、デフォルトのキーバインドを使用して、ctrl-V、tab と入力してリテラル タブを生成します。)
ちなみに、これにより変数キャプチャのアンチパターンも取り除かれます。出力を変数にキャプチャするのには十分な理由がありますが、それを避けることができれば、多くの場合、よりシンプルで堅牢で効率的な、より慣用的で洗練されたスクリプトになります。(この孤立したケースでは、ログ ファイル名を変数に入れる理由もわかりませんが、より大きなスクリプトでは意味があるかもしれません。)
#!/bin/bash
fid=log.txt;
sentence=$(sed -n '100p' ${fid});
for word in $sentence
do
echo $word
done
ドル記号と括弧を入れて問題を解く