『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

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

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

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

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

このQ&Aに関連する最新のQ&A

A 回答 (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. …
SED FAQ - Frequently asked questions or "He Sed | She Sed"
http://www.dreamwvr.com/sed-info/sed-faq.html
    • good
    • 1

本当にやりたいことは、改行コードの削除ではなく、sedでそれをどのおうにして実現するかとういことですね。


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

参考URL:http://www.kabipan.com/computer/sed/index.html
    • good
    • 0
この回答へのお礼

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

そして、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

> 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 を実行する
というやり方ですかね。
    • good
    • 1
この回答へのお礼

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

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

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

よろしくお願いします。

お礼日時:2007/06/17 01:20

sedコマンドを使用しないとだめですか?(たとえばperl,AWK等)


また、環境(OS)は、なんでしょうか?
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/06/15 23:49

sedの動作は、



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

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

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

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

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

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

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

よろしくお願いします。

お礼日時:2007/06/15 23:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qawkで改行を除いて文字列を抜きだす

こんにちは。

UNIXユーザーです。

awkでテキストファイルから行、列を指定して、文字列を抜き出し、それをシェルで変数として定義したいのですが、各行の最終列(最も右の列です)を指定すると、抜き出した文字列の末尾に’^M’がついてしまいます。
これが改行を意味するということは分かったのですが、これを取り除くためにはどうしたらよいでしょうか??

どなた様かご教授ください。
よろしくお願いいたします。

Aベストアンサー

改行文字、というか CR(ASCIIコード0x0d)ですね。
元のテキストファイルはWindowsで作成したものじゃないですか?
Windowsではテキストの改行にCR+LF(0x0d 0x0a)の2バイトを使い、UnixではLF(0x0a)の1バイトを使っています。
なんの工夫もせずにWindows→Unixへファイルを転送すると、LFは改行となりますが、CRはそのまま「文字」として残ってしまします。awkでは1行単位でLFを除いた状態で処理するので、CRが残ってしまっている、ということです。

awkで取り除く方法は既出なので、別の手段としては
・Windows上でLFで保存する: そのテキストファイルを作成するソフトによっては可能です。
・Unixへ転送時にテキストモードを使用する: ftpでは、これでCRが取り除かれます。バイナリーファイルでやってしまうと、ファイルが破壊されますので、バイナリーファイルはバイナリーモードで。
・Unix上のツールでCRを取り除く: (インストールされているなら) dos2unixやnkfといったコマンドで改行コードの変換ができます。 そのままパイプでawkに繋いでもいいです

改行文字、というか CR(ASCIIコード0x0d)ですね。
元のテキストファイルはWindowsで作成したものじゃないですか?
Windowsではテキストの改行にCR+LF(0x0d 0x0a)の2バイトを使い、UnixではLF(0x0a)の1バイトを使っています。
なんの工夫もせずにWindows→Unixへファイルを転送すると、LFは改行となりますが、CRはそのまま「文字」として残ってしまします。awkでは1行単位でLFを除いた状態で処理するので、CRが残ってしまっている、ということです。

awkで取り除く方法は既出なので、別の手段としては
・Windows上で...続きを読む

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QAWKで1項目以外を簡単に出力したい

awkのprint出力で$1$2$3$4$5$6と書くのではなく、$1から$6までを簡潔に指定できる方法はありませんか? (たとえば$1-$6のような)
すべて出力したい場合は$0でいいのですが、1項目だけ除外してあとはすべて出力したい時に項目が多い大変ですから。

Aベストアンサー

最後のフィールドだけ消せばいいのなら、組み込み変数NFをデクリメント
してやればいいです。$7=""だと中身が空のフィールドになるだけなので
余計なセパレータが出力されるように見えているのです。

ひょっとしたらNFをデクリメントしたあとで$0の再構築を
強制的にさせる必要があるかもしれません($0=$0 とか $1=$1で
やってくれるはず)。

Qgrep 検索 検索対象の行と、そのn段下(もしくは上)までの行を合わせて出力したい

ファイル ./test の内容は以下のとおりです。

test1
30
50
12
test2
60
12
01
test3
***
20
***

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(1)例えば "test2"という文字列を含む行と、合わせて下3行を拾って表示させたい時は、どのようにコマンドを打てばよいのですか?

test2
60
12
01
のように表示させたい。

(2)あらかじめ、とりだしたい情報がn行目にあるとわかっている時に、
取り出したい行を複数指定して表示させるにはどのようにコマンドを打てばよいですか?

Aベストアンサー

(1)
$ grep -A 3 test2 ./test
-Aオプションで、マッチしたところから指定した行数分後ろの行まで表示します。(A=Afterの意)
(同様に、-B オプションで、マッチしたところより前の行を表示することもできます。(B=Beforeの意))

(2)
抽出する行が1つだけなら、
tail コマンドとheadコマンドの組み合わせでできます。
$ tail +5 ./test | head -1
で、ファイル「test」の5行目1行だけを抽出できます。

開始行を指定して複数行抽出したい場合なら、
$ tail +5 ./test | head -3
で、ファイル「test」の5行目からの3行分を抽出できます。

(tail コマンドの「+数字」で、指定した行数以降を抽出し、それをパイプでつないで、head コマンドの 「-数字」 先頭から指定行数取り出し)

複数の開始行を指定して、それぞれから1行ずつ抽出したい場合、
bash などの bource shell 系なら、for コマンドを使って、
$ for n in 1 5 9; do tail +$n ./test | head -1; done
で、1行目、5行目、9行目を抽出できます。

(1)
$ grep -A 3 test2 ./test
-Aオプションで、マッチしたところから指定した行数分後ろの行まで表示します。(A=Afterの意)
(同様に、-B オプションで、マッチしたところより前の行を表示することもできます。(B=Beforeの意))

(2)
抽出する行が1つだけなら、
tail コマンドとheadコマンドの組み合わせでできます。
$ tail +5 ./test | head -1
で、ファイル「test」の5行目1行だけを抽出できます。

開始行を指定して複数行抽出したい場合なら、
$ tail +5 ./test | head -3
で、ファイル「test」...続きを読む

QLinux環境 grepで改行コード(CRLF、LF)を検索できないで

Linux環境 grepで改行コード(CRLF、LF)を検索できないでしょうか?
grep '\t\n' aaa.txtとしても、「\」はエスケープしてしまいます。
検索方法、grep以外でもご存知の方いらっしゃいましたらご教示いただけたら幸いです。

Aベストアンサー

GNU grep 2.5.4 だと、実験的なものだとかかれていますが
-P オプションで perl の正規表現が使えます。

それを使えば

grep -P '\r\n' aaa.txt
で CRLF を持つ行を抽出できます。

他の方が書かれているように CR は \t ではなく、
\r です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング