2016-03-31 6 views
0

私の目標は、言葉式exprのbashは

#!/bin/bash 
fid=log.txt; 

sentence=`expr sed -n '100p' ${fid}`; 
for word in $sentence 
do 
    echo $word 
done 

への文章のデータを分離し、その後、100番目の行をsedは、文字列に変換することですが、どうやらこれは失敗したが動作しません。 。

expr: syntax error 

誰かが私に間違ったことを教えてください。これまで働いていた数字のために。

+0

以前のsedコマンドでは、 'expr 'は引数の式として数値を取ることができます。 – SLePort

答えて

1

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とタイプし、リテラルタブを生成します)

なお、これは可変キャプチャ反パターンも取り除きます。変数を出力するのには良い理由がありますが、それが回避できれば、よりシンプルで堅牢で効率的で、より慣用的でエレガントなスクリプトになることがよくあります。 (この孤立したケースでは、変数にログファイル名を入れる理由はありませんが、大規模なスクリプトでは意味があるかもしれません)

+0

すべてがここで言われています。 +1 – SLePort

0
#!/bin/bash 

fid=log.txt; 

sentence=$(sed -n '100p' ${fid}); 
for word in $sentence 
do 
    echo $word 
done 

はドル記号や括弧は、私はあなたがこの場合は式exprコマンドを必要としないと思う問題

+0

ドル記号とカッコでは違いがありません。これは 'expr'の削除です。バックティックも機能します。 –

1

を解決置きます。 exprを使用して計算します。

expr 1 + 1 

ただ、この1つは罰金です:ような何か

sentence=`sed -n '100p' ${fid}`; 
関連する問題