2017-09-06 6 views
0

ファイルをフォーマットするLinuxコマンドを実行する次のTCLスクリプトがあります。tclを使ってLinuxコマンドを実行する際にエラーが発生する

 
exec sed -r '2,$s/(.{55})/\1\n\t/g' $formatfileName | sed 's/ $//' > $formatfileName 

私は「S」読み取ることができないというエラーが出ます: 上記の行を実行しながら、そのような変数を - これは、変数として、Linuxのコマンドで$記号を検討しています。中括弧{}を入れようとしましたが、うまくいきませんでした。

上記のコマンドをエラーなしで使用する方法を教えてください。ご協力いただきありがとうございます。

答えて

2

Tclでは一重引用符を使用しません。 Tclの等価は中括弧です(適切なネストを除く)。また、読んでいるファイルとは別のファイルに書き込む必要があります。あるいは、さまざまなビットが読み込み用にファイルを開いてファイルを消去する書き込みのために、いくつかの難しい競合条件が発生します。 (後で名前を変更することができます)。このようなものはうまくいくはずです。

私は強く、純粋のTcl(長いが、今ポータブル)でこれを行うために誘惑されるだろう、と述べた
exec sed -r {2,$s/(.{55})/\1\n\t/g} $formatfileName | sed {s/ $//} > $formatfileName.new 
file rename -force $formatfileName.new $formatfileName 

set f [open $formatfileName] 
set lines [split [read $f] "\n"] 
close $f 

set f [open $formatfileName "w"] 
foreach line $lines { 
    # First line is special 
    if {[incr LN] == 1} { 
     puts $f [string trimright $line] 
     continue 
    } 
    foreach l [split [regsub {.{55} } $line "&\n\t"] "\n"] { 
     puts $f [string trimright $l] 
    } 
} 
close $f 

string trimright sが効果的に二sedが何をしていたかやっています、途中のregsubは最初のsedとよく似ていますが、内側にsplitを使用していますので、トリミングを一貫して適用することができます。

ここには厄介なものはありませんfile rename;読み取りは書き込みの前にあります。

+0

また、 'sed'は複数のパターンを渡してコマンドラインに適用することができます。パイプは必要ありません。 –

+0

Donal Fellowsに感謝します。中括弧で修正されたLinuxの部分は、魅力的なものです。 Tclコードをありがとう、それはLinuxコードに非常に近いです。私は、ニーズを満たすためにいくつかの変更を行うことを学ぶことを試みています。 – NewCoder

+0

ブラッド・ラナムに感謝しました。 – NewCoder

関連する問題