おまいら! sed の使い方教えて下さいm(_ _)m

このエントリーをはてなブックマークに追加
131login:Penguin:2008/10/28(火) 03:01:43 ID:/qenFkSI
/bbb$/{
N
s/\n//
}

でどう?

マッチ文字列や置換文字列に \n が使えるかどうかは環境によるので
お前さんがどういうところで使っているかを書かなければ答えようがない。
132login:Penguin:2008/11/09(日) 22:38:03 ID:iboFIZ94
>「Error」がある行に,「### Check Line ###」という新しい行を追加する
>$ $ sed -e "/Error/i #### Check Line ###" source.txt

↑の構文なのですが、「新しい行を追加する」のではなく、
行の入れ替えを行う方法は無いでしょうか?
133login:Penguin:2008/11/10(月) 02:48:47 ID:oBt1rply
>>132
入れ替えって何と何を入れ替えるの?
#### の行を先に出力したいってこと?
134login:Penguin:2008/11/10(月) 05:23:57 ID:Vv2a12Zc
>>133
例えば、以下のようなテキストがあった場合
111
222
Error 333
444
555

「Error」がある行に,「### Check Line ###」という行に入れ替えたいです。
以下のようなイメージです。
111
222
### Check Line ###
444
555

135login:Penguin:2008/11/10(月) 05:33:29 ID:e8TF6STv
iじゃなくてc使う
136login:Penguin:2008/11/11(火) 21:48:17 ID:DQj2Ej4A
>>135
遅くなりましたが有難うございました!
137login:Penguin:2008/11/15(土) 16:52:59 ID:FFNCNb8R
ナイスなスレだな
138login:Penguin:2008/12/02(火) 10:28:40 ID:2vyuRZ6k
なぜawkを使わない?
139login:Penguin:2008/12/03(水) 01:46:50 ID:O9/K8qme
下記のtest.datから、
[1が出現してから3が出現するまでの行]はアドレス範囲を使えば簡単に取得できますが
$ sed -n -e '/^1/,/^3/p' test.dat
[1が出現してから3が出現する前の行]を取得するにはどうやるのでしょうか?
$ sed -n -e '/^1/,/^3/p' test.dat | sed -e '$d'
でもいいのですが、1回のsedで済ますにはどうすればよいでしょう?

$ cat >test.dat
0
1
2
3
4
5
^D
140login:Penguin:2008/12/03(水) 02:53:15 ID:1xcvKxcT
>>139

 sed -ne '/1/,/3/{/3/q; p'

141139:2008/12/03(水) 08:40:11 ID:O9/K8qme
>>140
こういう時にqを使うんだ。
物凄く恥ずかしながら、目から鱗状態です。
2週間の間、何度も思い出しては考えても分からなかったので質問してみた。
ありがとう。
142 [―{}@{}@{}-] login:Penguin:2009/04/08(水) 08:59:15 ID:DR9diDX0
143 [―{}@{}@{}-] login:Penguin:2009/04/08(水) 09:00:09 ID:DR9diDX0
144 [―{}@{}@{}-] login:Penguin:2009/04/08(水) 09:01:33 ID:DR9diDX0
145 [―{}@{}@{}-] login:Penguin:2009/04/08(水) 09:04:26 ID:DR9diDX0
146 [―{}@{}@{}-] login:Penguin:2009/04/08(水) 09:08:12 ID:DR9diDX0
147login:Penguin:2010/06/01(火) 16:15:16 ID:8+L/+i95
i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`

スクリプト中のこの1文の意味が良く分かりません。
どういう処理をしているのか教えていただけないでしょうか。
148login:Penguin:2010/06/01(火) 23:50:47 ID:AqF3qhLQ
149login:Penguin:2010/06/09(水) 19:12:55 ID:wFAc03EY
(^\^)
150login:Penguin:2010/11/14(日) 21:29:00 ID:CtwAJPsE
(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)
(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)
(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)
(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)
(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)(^^;)
151login:Penguin:2011/02/20(日) 11:30:28.89 ID:u91J24A/
だれもイナイですね。
cueシートに埋め込まれたFILE名に含まれるスペースをアンダースコアに置換しました。
かなり強引です。はじめてsedを使いました。もっと賢いやり方を教えてもらえれば幸いです。

/^FILE /{s/ /_/g;s/_WAVE/ WAVE/;s/FILE_/FILE /}
152login:Penguin:2011/02/20(日) 11:58:55.03 ID:W0Om8OH5
>>151
>だれもイナイですね。

枯れてるから特に話題も無いだけ。
まともに質問する気があるなら詳細条件書きなよ。
153login:Penguin:2011/02/20(日) 12:38:50.24 ID:u91J24A/
音楽用のcueシートがあります。
http://foobar2000.xrea.jp/index.php?foobar2000%E3%81%A8cue%E3%82%B7%E3%83%BC%E3%83%88

Tipsのような内容なのです。

FILE "高橋幸宏 - ARE YOU RECEIVING ME.wav" WAVE
 TRACK 01 AUDIO
  TITLE "Are You Receiving Me?"
  PERFORMER "高橋幸宏"
  INDEX 01 00:00:00
FILE "坂本龍一 - UNDO #1.wav" WAVE
 TRACK 01 AUDIO
  TITLE "Undo #1"
  PERFORMER "坂本龍一"
  INDEX 01 00:00:00

上記のFILEの"で括られた中のスペースをアンダースコアに置換したいのです。
>151 ではFILEの行にのスペースに対して一度すべてアンダースコアにしてます。
するとFILE_と_WAVEとなりるので、あとでこの2つに対してアンダースコアをスペースに戻しました。
154login:Penguin:2011/02/20(日) 12:41:41.79 ID:u91J24A/
本来ならばFILEを探した後、"を探し、その後"が出てくるまで
スペースをアンダースコアに置換するのが良いのでしょうが、難しくて私にはムリです。
で、上記の案で逃げました。
155login:Penguin:2011/02/20(日) 16:47:44.30 ID:W0Om8OH5
「FILE」で始まる行のダブルクォートで括られた文字列の中のスペースのみを「_」に置換したいって事?

なら、その方法が現実解だと思うよ。

行の特定の範囲だけを対象にして置換をかけるってのはsedだけだと難しいんじゃないかな。
少なくとも俺には無理なので、sedマスターの降臨を待つしかない。
156login:Penguin:2011/02/20(日) 19:26:50.99 ID:u91J24A/
そうですか。ありがとうございました。
157login:Penguin:2011/03/23(水) 08:12:08.06 ID:sSsfO317
/^FILE "\(.*\)" WAVE/{s//\1/;y/ /_/;s/.*/FILE "&" WAVE/}
とかすればよいのでは?
まぁ、同じく置換が3回入るので効率はあまり変わりませんが...
158login:Penguin:2011/03/24(木) 17:45:58.62 ID:Xy4asZTd
正道だと、こうなるのですね。ありがとうございます。
159login:Penguin:2011/09/21(水) 16:48:38.31 ID:w//dmoHs
ファイルの最後5行を削除する例としてネットで以下を見つけたのですが、
 sed -e '$-4,$d' file
現在使用中のCentOS環境ではGNU sed 4.1.5版で以下のようなエラーが表示されてしまいます。
 sed: -e 表現 #1, 文字数 2: 未知のコマンドです: 「-」
GNUサイトから4.2をダウンロードしてみましたが、やっぱりダメで
そもそも上記の例がなんのsed(?)で実現したものなのかもわからないのですが…。

実際にやりたかったのはファイルの最後n行だけを対象に置換処理をすることで
 sed -e '$-4,$s/hoge/piyo/'
のようにしてみましたが当然ダメでした。

事前にwc -lで行数を取得し、exprで-4する方法と組み合わせるなどすれば
範囲を特定することもできると思いますが、
sedだけで完結できる方法はないでしょうか?
160login:Penguin:2011/09/22(木) 12:25:27.36 ID:KTYpcKqF
>>159
こんなに下がっているスレで質問するときは上げた方がいい。誰にも気が付かれないかも知れない。

それ本当にsedのスクリプト?自分にはedのスクリプトに見えるが、それを見つけたページが分からないと何とも。

分かってると思うけど、sedは一行ずつ順番に処理していくから、後戻りは出来ないし事前に最終行も分からない。
だから、工夫が必要で下のようになる。分かりやすく汎用的に書くならsedスクリプトを書くしかないね。
sed '1{N;N;N;N};$!{P;N;D};s/hoge/piyo/g' file
sed '1{x;d};2,4{H;d};5{x;G};$!{P;N;D};s/hoge/piyo/g' file

でもこれは、嫌だな。スクリプトで書くと分かり易いんだけど…
tac使っていいのなら、tac | sed '1,5s/hoge/piyo/' | tacって書けるけど遅いだろうね。
161159:2011/09/22(木) 14:33:51.94 ID:IWU2+wB3
>>160
返信ありがとうございます。m(_ _)m
2chビューアのデフォルトに慣れていたせいで上げ忘れました(^^;

ネットで見かけたサンプルはGoogleで
「sed (最終|最後)*行 削除」を検索すればいくつか見つかると思いますが
OSやsedバージョンまでは書かれていないのでその辺がなんとも…。

sedのパターンスペースは使ったことがなかったので
ちょっと勉強してみたいと思いますが、
他人(未来の自分)が見ても理解できないかもしれませんね…
162login:Penguin:2011/09/22(木) 23:43:57.24 ID:KTYpcKqF
>>161
それで出たわ。「"sed -e '$-3,$d' file"」でググると出るわ出るわ…
POSIXの規格読むと分かるけど、sedのアドレスにそんな指定方法はないし、
そもそも仕組み上そんな指定ができる訳がない。(そういう実装だとsedの良さがなくなる)

でも、ちょっとコマンド叩けば直ぐ試せるのに、ここまで間違った記述が蔓延したのは疑問。
気になって調べたら、どうも「入門UNIXシェルプログラミング 改訂第2版」が犯人。
正誤表に訂正あり。(参考:ttp://www.sbcr.jp/support/8429.html

さらに、発売日以前に絞ってググったら、どっかの大学生がコピペしたページのみヒット。
コピー元は2003年まではあったようだから、つまり
間違った記述の1ページ → それを検証せず本に記載 → それをさらに検証せずにネットにコピペ
という流れで嘘情報が増大していったようだ。試せば出来ないことなんて瞬時に分かるのに…

ネット上の出展不明、再現もしくは検証不能情報は信用するなってことだな。
ところで、元レスの「"sed -e '$-4,$d' file"」で検索をかけても一件もヒットしなかったぞ。
わざわざ書き換えて転載されると検索にもでなくて困るよ(´・ω・`)
163login:Penguin:2011/09/22(木) 23:57:58.95 ID:KTYpcKqF
上の例に加えてもう一つ。一番分かりやすく書くとこうかな。

sed ': loop
1,4 { N
   b loop
}
$! { P
   N
   D }
s/hoge/piyo/g' file

こう書くと改行が入ってワンライナーにはつらいがしかたない。
ついでに言うとsedは普通パターンスペースしか使わない。使ったことないってのは変だ。
上のもパターンスペースしか使ってない。

POSIXにはないけど、GNU textutils(tacもそうだった)ならこんなのもいけるはず。
{ head -n -5 file && tail -n 5 | sed 's/hoge/piyo/'; }
164login:Penguin:2011/09/23(金) 14:24:33.02 ID:vKgog6QO
>>159
最後の5行だけ置換対象とする
#!/bin/sh
sed "$(($(sed -n '$=' file)-5+1)),$ s/hoge/piyo/" file

sedしか使ってないよ〜
/bin/shのArithmetic Expansionは使ってるけど
165164:2011/09/23(金) 14:50:32.68 ID:vKgog6QO
あ、fileは5行以上って前提
そこは工夫しないと
166login:Penguin:2012/06/07(木) 10:18:04.20 ID:srWmu+na
1行目の後にtestを入れるつもりがエラーになります。
>cat text.txt| sed -e '1atest'
sed: 1: "1atest
": command a expects \ followed by text

シェルの中で、置換と追加をやりたので、実際はこうなってます。
sed -e 's/Before/After/g' \
-e '1iコメント' \
  -e '12iコメント' \
 元ファイル > 新ファイル

行追加だけエラーになるのですが、
どこがおかしいのでしょうか?
167login:Penguin:2012/06/07(木) 20:33:53.89 ID:1zdUDRFK
>>166
質問の仕方から勉強すべき
どういう状態で何をするとどうなるのか
誰でも再現できるような説明を書くべき
168login:Penguin:2012/06/30(土) 11:03:57.16 ID:JdPlGyq5
sed使うくらいならperl使った方が楽。
169login:Penguin:2012/06/30(土) 11:18:32.68 ID:kfAX5M5C
>>168
遅れてる〜
170login:Penguin:2012/07/02(月) 23:12:12.79 ID:hH2EDXHS
>>168
perl使いってマジで気持ち悪い
どんな場面でも無理やりperlを使おうとする
シンプルなコマンドの組み合わせで機能を実現できたり、
よりモダンな言語やスクリプトで簡単に実現できるのに
強引なまでにperlにこだわる
(emacs使いもその傾向有り)
殆ど病気だわ
171login:Penguin:2012/07/31(火) 04:16:59.47 ID:79ga/vr4
常識で考えて、sedのバッファやりくりでパズルするくらいならperlのほうが楽だろ。
172login:Penguin:2012/07/31(火) 14:10:23.75 ID:SnlNjA/Q
>170
徒歩5分の距離にある目的地と徒歩1時間のそれ、そこに行くために歩いても自転車をこいでも自動車に乗ってもその人の自由でしょ。
常に特定の手段しか使わない人に関わりたくなければその人から遠ざかっていればいいじゃない。
173login:Penguin:2012/08/30(木) 20:41:42.25 ID:kbI/S7Ao
スレ違いで申し訳ないんっですが、join コマンドの使い方について教えてください。

下記のような「時間,数値」を持ったcsvファイルがあり、時間をキーにして結合したいと思っています。
コマンドを調べたところ「join」(もしくはpaste)コマンドがぴったりだったので

join aaa.csv bbb.csv

とコマンドを実行したのですが、期待結果が返ってきません。
ファイルの内容と期待結果は以下です。

aaa.csv
-----------------------
23:00:00,4.12
23:05:00,17.07
23:10:00,2.04
-----------------------

bbb.csv
-----------------------
23:00:00,4.35
23:05:00,8.39
23:10:00,2.07
-----------------------

ジョインした期待結果
-----------------------
23:00:00,4.12,4.35
23:05:00,17.07,8.39
23:10:00,2.04,2.07
----------------------

どうしたら期待結果のようになるでしょうか?
174login:Penguin:2012/08/30(木) 21:13:34.46 ID:kFZpMX1L
スレ違いだとわかってるなら適切なスレで聞いてください。
175login:Penguin:2012/08/30(木) 21:40:21.10 ID:R2lX72jf
catじゃだめなのか…
176login:Penguin:2012/08/30(木) 21:48:28.92 ID:kbI/S7Ao
>175
catコマンドで横に結合できるのでしょうか?><
177login:Penguin:2012/08/30(木) 23:35:50.57 ID:2CJ6F/qn
>>176
スレ違いっ><
失せろっm(__)m
178login:Penguin:2012/08/31(金) 08:24:07.87 ID:5kRScUpP
>>173
sed スレなんだから、sed を1つでも使ってやれよ!w
179login:Penguin:2013/11/04(月) 18:07:02.93 ID:p0Jz6Hdm
ちーばくん

ヘ__/ ̄ ̄ ̄\
\ノ  (・)   ヽ__)
 \_ノ    丿
  (ノー、  |
    ノ  ヽ
   /  | |
   |  (_ノ
   \  /
    ) /
    (_ノ
180login:Penguin
>>173
もう見てはいないだろうが、 -t でちゃんとセパレータを設定する必要がある。