こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

今、宿題が出ているのですが、
ネットで探しても基本的な部分以外を把握できなくて困っています。

sedコマンドで改行コードを削除してテキストを一列にするコマンド、お分かりのかたいたら尾根がします。

sed 's/\n//g' test.txt

このコマンドでよいかと思ったのですがちっともうまくいきません。
何がおかしいのか、
どのコマンドが正しいのか、ご教授いただけないでしょうか。

投稿日時 - 2007-06-14 22:50:49

QNo.3085426

困ってます

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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

投稿日時 - 2007-06-17 03:42:09

ANo.4

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

参考URL:http://www.kabipan.com/computer/sed/index.html

投稿日時 - 2007-06-16 06:13:05

お礼

書き込みありがとうございます。

そして、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といった意味ですか?
また、"&\"の意味することは何ですか?
(そして何を得るコマンドになるのでしょうか。。)

ホント、探した内容を理解できずに情けないのですが
ご面倒だと思うのですが、教えてはいただけませんか?

よろしくお願いします。

投稿日時 - 2007-06-17 00:11:11

ANo.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 を実行する
というやり方ですかね。

投稿日時 - 2007-06-16 01:56:07

お礼

引き続きの書き込みありがとうございました。
丁寧に説明いただけたのでやっとなんとかわかりました。

宿題は宿題ですが、点数のでる宿題ではなく、、、
しばらくお休みされる方がお勉強がてらにやっておくように
出してくれたものでして、、、なんとか知りたい内容でして;;すみません。

Nコマンドの使用例を探したのですが、
ed ':a; /\\$/N; s/\\\n//; ta' (末尾への\と一緒に行を連結)
ここで表記されている「N」がNコマンドの実際の使用方法となるのでしょうか。
そして、「s」コマンドとは違い、難しい・・・ということで合ってますか?
「:a;」この表記も構文にあるのでしょうか?「a」はコマンドですか?
「 /\\$/N;」の表記内で、「\\$」は何を意味しているのでしょうか。「$」前に「\\」がを必要な訳は?
「 ta'」この表記も構文にあるのでしょうか?「ta」はコマンドですか?

よろしくお願いします。

投稿日時 - 2007-06-17 01:20:57

ANo.2

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

投稿日時 - 2007-06-15 11:31:47

お礼

書き込みありがとうございます。

今、調べているのはsedによる使用です。
osはAIXです。

sedでは無理なのでしょうか?

投稿日時 - 2007-06-15 23:49:14

ANo.1

sedの動作は、

・一行読み込む
・*改行の手前まで*をパターンスペースに送る
・ユーザーのコマンドを実行
・パターンスペースの末尾に*改行を付加して*出力

というものですので、
sed 's/\n//g' test.txt
ということをいくらやっても、ないものを削除しようとしていることでしかないので
無意味です。

NコマンドとかHコマンドを使って、全体を読み込んでから一気に改行を削除するという
ことになるでしょうが、規格上は8kバイトくらいまでしかバッファのサイズは
保証されていないはずなので、やってもうまく行くとは限りません。

>ご教授いただけないでしょうか。
こういう場での「教えてくれ」というのに対応するのは
「教示」です。「教授」じゃありません。

投稿日時 - 2007-06-15 00:54:56

お礼

書き込みありがとうございます。

>NコマンドとかHコマンドを使って、全体を読み込んでから一気に改行を削除する
NコマンドやHコマンドをどのように使用するのか、
実際のコマンド行を教えてください。

また、sedの動作で、
・*改行の手前まで*をとは何ですか?
・ユーザコマンドはどこにあたりますか?
・*改行を付加して*出力とは一体なんですか?
(sed 's/aaa/jjj/g' text.txtだった場合)

よろしくお願いします。

投稿日時 - 2007-06-15 23:47:23

あなたにオススメの質問