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

上記のスクリプトは、sourceforge で見つかった sed ワンライナーのすばらしいリストからのものです。

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

これについて私の考えをもう一度まとめさせてください..

後で...

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

4

2 に答える 2

3

あなたのスクリプトを見なければ、何が問題なのか私には明らかではありません。ここでの簡単なテストでは、単純なスクリプト内で問題なく動作しました。

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

コマンドを文字列または変数内に埋め込もうとしている場合、\n はエスケープ候補になります。

価値があるのは、高度なコンテナーが本当に必要な場合を除き (これはまれです)、まっすぐな /bin/sh posix 準拠のシェル スクリプトよりも bash 固有のスクリプトを作成する「強力な」ケースはめったにありません。最終的には、他の数十の posix/korn/bourne 互換シェル (bash を含む) に対してかなり移植性の高いスクリプトになります。

乾杯!ショーン

于 2009-05-20T01:50:07.870 に答える
1

"$@"ファイル名の引数を示す がありませんか?標準入力からのみ読み取っていましたか?

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

私のために動作します-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
$
于 2009-05-20T01:53:27.673 に答える