• 締切済み

sedコマンドで改行コードを削除してテキストを一列にする 方法

今、宿題が出ているのですが、 ネットで探しても基本的な部分以外を把握できなくて困っています。 sedコマンドで改行コードを削除してテキストを一列にするコマンド、お分かりのかたいたら尾根がします。 sed 's/\n//g' test.txt このコマンドでよいかと思ったのですがちっともうまくいきません。 何がおかしいのか、 どのコマンドが正しいのか、ご教授いただけないでしょうか。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

使っているシステムが何かわかりませんけど、 man sed とか info sed とかしてみました? ネットで使用例探すのもいいですけど、とりあえずはどういうコマンドがあるのかを 把握しとかないと。 > Nコマンドの使用例を探したのですが、 > ed ':a; /\\$/N; s/\\\n//; ta' (末尾への\と一緒に行を連結) 説明のため複数行に分けます :a ← ラベルの指定(ここでは'a') /\\/N ← \ がその行にあったらNコマンドを実行 (\はエスケープしないといけないので二重になっているのに注意) s/\\n// ← '\n' という文字列を削除(最初に見つかる一回だけ) ta ← 置換が起きた場合にはラベル aにジャンプ という流れです。 ついでに > /abc$/N > s/\n// > というコマンドを実行すれば・・・ > /////////////// > この意味は、 > sed /abc$/N text.txt > sed s/\n// text.txt 違います。 あえて書くなら sed -e '/abc$/N; s/\n//' test.txt か sed -e '/abc$/N' -e 's/\n//' test.txt です。 (-eオプションはお好みで。わたしはいつもつけますのでここでもそうします) sedを二回に分けて起動しちゃダメですよ。この場合は。 > s/xyz/&\ > / > > の如し。(例は xyz の後に改行を挿入する。& はマッチ全体を示すなり) > /////////////// > この意味は、sed s/xyz/&\/ text.txtといった意味ですか? ちがいます。 \のあとで改行しているのには意味がありますから、/&\/のようにしてはダメです。 つか、そうするとエラーになりませんか? > また、"&\"の意味することは何ですか? >(そして何を得るコマンドになるのでしょうか。。) /&\ / だったとして、 &は、s/置換対象/置換後の文字列/ としたときの、置換対象にあたる部分に 展開されます。 ですから、この場合は xyz(改行) になります。 GNU sed なんかだと、置換後の文字列に \n と書くと改行として解釈してくれるのですが、 伝統的なsedではそういうことはしてくれないので、わざわざ本物の 改行を上のような手段で含めてやらなければならないのです。 Man page on sed ftp://ftp.kek.jp/kek/unix4hep/html/sed1.html Manpage of SED http://www.linux.or.jp/JM/html/GNU_sed/man1/sed.1.html SED FAQ - Frequently asked questions or "He Sed | She Sed" http://www.dreamwvr.com/sed-info/sed-faq.html

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

本当にやりたいことは、改行コードの削除ではなく、sedでそれをどのおうにして実現するかとういことですね。 基本的にはsedでは、無理があると思いますが、参考URLに改行の削除方法が記載されています。しかし、sedで改行を削除しなさいという課題自体に問題があるような気もします。 参考までにtrなら tr -d '\012' < infile > outfile でoutfileに改行が削除されたファイルが作られます。

参考URL:
http://www.kabipan.com/computer/sed/index.html
iamafraid
質問者

お礼

書き込みありがとうございます。 そして、URLの添付ありがとうございます。 私もこのURLへは行き着いたのですが、 これまた理解できずに辟易してしまっていました。。トホホです。 もし、お分かりになるようでしたらお聞きしたい。。 /////////////// abcの後に改行が続く場合、この改行を削除しようとしてみる。 abc edf なる入力に対し、 /abc$/N s/\n// というコマンドを実行すれば・・・ /////////////// この意味は、 sed /abc$/N text.txt sed s/\n// text.txt の二行をスクリプトに記述して実行するという意味なのでしょうか。 /////////////// 入力にない改行の出力は、改行文字をバックスラッシュで隠せばよい。 s/xyz/&\ / の如し。(例は xyz の後に改行を挿入する。& はマッチ全体を示すなり) /////////////// この意味は、sed s/xyz/&\/ text.txtといった意味ですか? また、"&\"の意味することは何ですか? (そして何を得るコマンドになるのでしょうか。。) ホント、探した内容を理解できずに情けないのですが ご面倒だと思うのですが、教えてはいただけませんか? よろしくお願いします。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> NコマンドやHコマンドをどのように使用するのか、 > 実際のコマンド行を教えてください。 宿題なんですよね? 解答を直接もらっちゃ意味ないんじゃないですか? 単純に使い方がわからないというのであれば、マニュアル見てね としかいえません。 > ・*改行の手前まで*をとは何ですか? > ・ユーザコマンドはどこにあたりますか? > ・*改行を付加して*出力とは一体なんですか? > (sed 's/aaa/jjj/g' text.txtだった場合) text.txtの中身が aaabbbccc dddeeefff ggghhhiii という三行だったとします。 ・まず一行読み込みます(dの手前にある改行まで)。 ・改行の手前までをパターンスペースに送ります。 ・今回は s/aaa/jjj/g がユーザーコマンドです。 ファイルにスクリプトを書いた場合などは複数のコマンドが 存在する場合があります。 ・sコマンドをパターンスペースに対して実行します ・結果を標準出力に送りますがこのとき末尾に改行を付加します。 Man page on sed ftp://ftp.kek.jp/kek/unix4hep/html/sed1.html `N' Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then `sed' exits without processing any more commands. ということなので、ひたすらホールドスペースに溜め込んでいって 入力の終端にきたらホールドスペースの内容をパターンスペースに 持ってきてから s/\n//g を実行する というやり方ですかね。

iamafraid
質問者

お礼

引き続きの書き込みありがとうございました。 丁寧に説明いただけたのでやっとなんとかわかりました。 宿題は宿題ですが、点数のでる宿題ではなく、、、 しばらくお休みされる方がお勉強がてらにやっておくように 出してくれたものでして、、、なんとか知りたい内容でして;;すみません。 Nコマンドの使用例を探したのですが、 ed ':a; /\\$/N; s/\\\n//; ta' (末尾への\と一緒に行を連結) ここで表記されている「N」がNコマンドの実際の使用方法となるのでしょうか。 そして、「s」コマンドとは違い、難しい・・・ということで合ってますか? 「:a;」この表記も構文にあるのでしょうか?「a」はコマンドですか? 「 /\\$/N;」の表記内で、「\\$」は何を意味しているのでしょうか。「$」前に「\\」がを必要な訳は? 「 ta'」この表記も構文にあるのでしょうか?「ta」はコマンドですか? よろしくお願いします。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

sedコマンドを使用しないとだめですか?(たとえばperl,AWK等) また、環境(OS)は、なんでしょうか?

iamafraid
質問者

お礼

書き込みありがとうございます。 今、調べているのはsedによる使用です。 osはAIXです。 sedでは無理なのでしょうか?

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

sedの動作は、 ・一行読み込む ・*改行の手前まで*をパターンスペースに送る ・ユーザーのコマンドを実行 ・パターンスペースの末尾に*改行を付加して*出力 というものですので、 sed 's/\n//g' test.txt ということをいくらやっても、ないものを削除しようとしていることでしかないので 無意味です。 NコマンドとかHコマンドを使って、全体を読み込んでから一気に改行を削除するという ことになるでしょうが、規格上は8kバイトくらいまでしかバッファのサイズは 保証されていないはずなので、やってもうまく行くとは限りません。 >ご教授いただけないでしょうか。 こういう場での「教えてくれ」というのに対応するのは 「教示」です。「教授」じゃありません。

iamafraid
質問者

お礼

書き込みありがとうございます。 >NコマンドとかHコマンドを使って、全体を読み込んでから一気に改行を削除する NコマンドやHコマンドをどのように使用するのか、 実際のコマンド行を教えてください。 また、sedの動作で、 ・*改行の手前まで*をとは何ですか? ・ユーザコマンドはどこにあたりますか? ・*改行を付加して*出力とは一体なんですか? (sed 's/aaa/jjj/g' text.txtだった場合) よろしくお願いします。