• ベストアンサー

改行してスペースという文字の並びを削除するスクリプト

シェルスクリプトでテキストを変換したいのですが、 テキストに改行につづいてスペースが入っている場合、それを削除したいのですが、どうやって書けばいいでしょうか? 複数行にわたる変換なので、うまくできないのです。 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

そうですか。sed でもホールドスペースを使って出来そうな気もしますが、考えるのがめんどくさい。 awkかperl,ruby等でプログラム的に書くんでしょうね。 もし、メールのヘッダ処理ならformailというソフトがあり指定のヘッダを複数行処理含めて取り出せた気がします。linuxなら標準でついてるかも。man formailはたしか英文。 awkだと、 NR==1{old=$0;next} /^ /{sub(" *","");old=old $0;next} {print old;old=$0} END{print old} こんな感じでしょうか?テストしてませんのでそのつもりで読んで下さい。 1行目ならそれを覚えておく。 行頭が空白ならそれを除去して覚えた行に追加する。(old=old " " $0 と空白で区切ったほうがいいかも) 先頭が空白以外なら覚えておいた行を書き出して、今の行を覚えておく。 最後に覚えておいた行を書き出す。 メールのヘッダだけ対象にするなら、上記の前に /^$/{BODY=1} BODY==1{print;next} を追加すればいい。 あと、行頭のタブも見ないといけないので/^ /のところを/^[ ]/にする([]内にはスペースとタブ)。

100Gold
質問者

お礼

ご回答ありがとうございます。 awkの達人ですね。 awkのコード(subとかnext)が自分ではよく理解できなかったので、アドバイスに従って、perlで書きました。 sedで一行解決できないものかとおもったんですが、むつかしいですね。 perlはこんなのです。 my $alltext = ''; while(<>) { $alltext .= $_; } $alltext =~ s/\n //g; print $alltext; 参考になりました。

その他の回答 (2)

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.3

こんにちは。私だったら Ruby のワンライナーでこう書いちゃいます。 ruby -e 'print IO.readlines(ARGV[0], nil)[0].gsub(/\n\s+/, "")' file ここでは各メソッドの詳細は省略しますが、 ご希望があればご説明いたします。

100Gold
質問者

お礼

ご回答ありがとうございます。 コードが短くていいですね。 残念ながらインストールしてないので、今回は使えませんが、勉強してみようと思います。 参考になりました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

行頭のスペースを削除するという意味ですよね。 sed 's/^ *//' infile > outfile もし、「コマンドを使わないでシェル組み込み機能だけで」ということなら出来ないでしょう。

100Gold
質問者

お礼

ご回答ありがとうございます。 行頭にスペースがある場合に、前の行の改行と行頭のスペースを削除したいです。