2009-05-20 17 views
0
# join pairs of lines side-by-side (like "paste") 
sed '$!N;s/\n/ /' 

上記のスクリプトは、sourceforgeで見つかったsed one-linersの素晴らしいリストに由来しています。なぜこのsedコマンドはbashスクリプト内で何もしませんが、外部で動作しますか?

私はそれをa bashスクリプトで使用したいと思いますが、スクリプト内で使用すると効果がありません。スクリプトの出力をパイプでパイプすると、説明したように、行のペアを並行して結合します。

一部の文字はエスケープする必要がありますが、bashスクリプト内で動作させるにはどの文字をエスケープする必要があるのか​​を「見る」ことができません。

ヨロシクおねがいしょう!その後

..

#!/bin/bash 
# numbers.sh 

for X in 1 2 3 4 5 6 7 8 9 0 
do 
     echo $X 
done 

このスクリプトを使用:

#!/bin/bash 

./numbers.sh | sed '$!N;s/\n/ /' 

が正常に動作します。..

1 2 
3 4 
5 6 
7 8 
9 0 

私はこの上で私の考えを再編成させてください。..

後で...

スクリプトで論理エラーが見つかりました。

答えて

3

スクリプトが表示されていない場合、問題が何であるかはわかりません。

#!/bin/bash 
cat /etc/crontab | sed '$!N;s/\n/ /' 

あなたは、文字列または変数内のコマンドを埋め込むしようとしている場合は、\ nはエスケープ候補になります。ここでは簡単なテストでは、それは簡単なスクリプトのうまく内部を働きました。

高度なコンテナ(まれである)が本当に必要な場合を除いて、bash固有のスクリプトをまっすぐな/ bin/sh posixに準拠したシェルスクリプトで作成することはめったにありません。あなたは、他の多くのposix/korn/bourne互換シェル(bashを含む)にかなり移植性の高いスクリプトで終わるでしょう。

乾杯! Sean

+0

私はbashを使用する理由はありませんでしたが、私は今、それがうまく動作することを確認しました。これは、スクリプトそのものに固有のものでなければなりません。 –

+1

catの役に立たない使用。 'sed '$!N; s/\ n//' Jens

1

"[email protected]"はファイル名引数を示すために入力していないので、標準入力からのみ読み込んでいましたか?

不正行為は何ですか?ファイルは単純に標準出力にコピーされましたか?

Works for me - Cygwinの下で動作します。 'al'は、1行に1つの引数をリストするプログラムです。

$ al a b c d e f | sed '$!N;s/\n/ /' 
a b 
c d 
e f 
$ cat xxx 
sed '$!N;s/\n/ /' 
$ al a b c d e f g | bash xxx 
a b 
c d 
e f 
g 
$ 
+0

悪い行為は、スクリプト内でsedコマンドによって出力が全く変更されなかったことです。 私は今、最も単純なケースでは期待どおりに動作することを確認しました。エスケープの問題ではありません。ご協力いただきありがとうございます! –