expr
がここに有用な目的を果たすようには見えない、そしてそれがなかった場合、sed
コマンドは確かに有効ではないでしょうかほとんどの状況下で、それを渡すのに有益なことです。あなたはたぶんそれを取り出すべきです。
しかし、次のループも問題です。 Unquoted variables in shell script are very frequently an error。この場合、for
ループに渡すものを引用することはできません(ループ変数は引用符付きの文字列に設定されているため、ループは1回だけ実行されます)が、シェルはワイルドカード拡張を実行できません引用符で囲まれていない文字列。文字列に*
が含まれていた場合、シェルはその文字列をカレントディレクトリのファイルリストに展開します。
幸いにも、これは少し複雑なsed
スクリプトで実行できます。
sed '100!d;s/[ \t]\+/\n/g;q' "$fid"
つまり、行番号が100でない場合は、この行を削除して次の行からやり直してください。それ以外の場合は、100行目です。空白の実行を改行で置き換え(print)、終了する。
(バックスラッシュエスケープコード\t
と\n
が普遍的に移植することはできません;。。繰り返しのため\+
もオプションの拡張である私は、コマンドの区切り文字としてセミコロンを嫌いsed
亜種もあると考えているあなたのsed
マニュアルページを参照してください、実験、そして他のすべて失敗し、多分念のためのAwkやPerlに切り替え、ここでもマックOSX上で動作バージョンがある場合:
sed '100!d
s/[ ][ ]*/\
/g;q' log.txt
角括弧内のものは、スペースとリテラルのタブであり、で。 Bash、デフォルトのキーバインディングでは、ctrl-Vとタイプし、リテラルタブを生成します)
なお、これは可変キャプチャ反パターンも取り除きます。変数を出力するのには良い理由がありますが、それが回避できれば、よりシンプルで堅牢で効率的で、より慣用的でエレガントなスクリプトになることがよくあります。 (この孤立したケースでは、変数にログファイル名を入れる理由はありませんが、大規模なスクリプトでは意味があるかもしれません)
以前のsedコマンドでは、 'expr 'は引数の式として数値を取ることができます。 – SLePort