sed
>>141
a.in-place オプションが使えるバージョンのsedを使う
b.inplaceというコマンドをつかってみる
c. (rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat
あるいは
http://pc10.2ch.net/test/read.cgi/unix/1157601611/708-727
あたりを参照 >>142
情報サンクス
a. の方法を用いました
問題解決したようだけどこぴぺして編集
・-i オプションをつかう
・-i オプションがないsedをつかっているなら in-place editing 対応の sed の導入を検討する
・ed をつかう
・perl を使う
・一時ファイルを必要としないファイル命名法を検討する
・http://www.idaemons.org/projects/inplace/ を使う
・(rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat
FreeBSD の標準 sed に -i オプションが取り入れられたのは 4.7R でそれ以前には無い。
NetBSD の標準 sed には -i オプションは無い。
OpenBSDの(ry
MacOSX の 標準 sed は FreeBSD 由来なので元になるバージョンに依存する。
MacOSX 10.3以降は FreeBSD 5.1R由来なので、 -iオプションはある。
以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 ) (3.02には in place オプションは無い)
仕事で root してる人に質問です。
皆さんどれぐらい仕事で sed スクリプト書いてます?
スクリプトの後々のメンテナンスと、既に周囲に読める人があまり
居ないこととを考えると、s での置換以外では perl を使うか、そ
うなったらもう全部 perl にした方がいいのかなと最近思ったりし
ます。
6行の sed スクリプトを書いたのですが、コメントが 8 行になっ
てしまって。。。
>>148
すぐに読めなくても、それがsedのスクリプトであることを書いておけば、
perlを使えるひとならちょっとの手間で読めるようになるでしょ。
そうでなければ>>150ということに。
それから、6行のスクリプトのコメントが8行になっても、それはそれでいいじゃないか。 sedの複数行は本当に頭痛がしてくる。
perでlさえ可読性悪いと言われてるのにその比じゃない。
個人的趣味以外で書いてはいけない sed のコードのそばに、
それを perl なり awk なりで書いたものを
コメントとして残せば
・可読性→クリア
・コメント行数→クリア
・メンテ→工数倍w s2pでいいじゃん、とかおもったりおもわなかったり sedで千行あるファイルの
100行目から150行目を
抜き出すには
どうしたらいいですか 単語の置換をしたいんだけど、どうしたらよいでしょうか
具体的な例で言うと、あるソース中の int を char に全置換したい
んだけど 単純に sed "s/int/char/g" だと printf まで変わって
しまうから それは避けたい。
「単語」の条件は 英数字+アンダースコア (\w+) であること。
これ絶対FAQだと思うんだけど、 「sed 単語 置換」 で検索しても
答にたどり着かなかったのですよ。 困った。 perl -pe 's/\bint\b/char/' >>159 アフォか
正解:
sed 's/\<int\>/char/g' >>159
ありがとうございました!
うまくいけました。 \< \>で思い出したけど、HP-UXのgrepではこれ使えんのだよな。
同じregexpライブラリを使っているなら、sedでも使えんな。
スレタイ読まずに書き込んで感謝されちゃったよ
こういうのを
いたたまれない気持ち
っていうのかな 1
2
3
4
というtemp.txtをsed N temp.txtとすると
1
2
3
4
になるのはわかるのですがsed n temp.txtにすると
2
3
4
にならないのはどうしてですか
夜も眠れません sed -e N -e 's/^/X/' -e 's/$/x/'
sed -e n -e 's/^/X/' -e 's/$/x/' 下記のように、置換する文字に変数って使えないんでしょうか?
設定ファイル100個飛ばしてしまったorz
forでループして、一気に変えたいんですが、$mlとそのまま置換されて
しまいます。このままだと、全部手がきです(T.T)
どなたかお助け下さい。
ml=hoge
sed 's/$ml/foo/' >>166
それはsedじゃなくて、シェルスクリプト側の話だね。
' ' じゃなくて " " を使う。
sed "s/$ml/foo/" ↑
できました!(T.T)
ありがとうございました。一時は徹夜を覚悟しました。
本当に助かりました。ありがとう! >>168
まさにそれ。
やりたいのは、特定の文字列を
現在のディレクトリ位置に置換したいということなんですが、
シェルスクリプトで
sed s/hoge/$PWD/g < file1.txt > file2.txt
と書くと、エラーになってしまいます。
($PWDが/を含んでいるから)
だれかうまいやり方わかりませんか? sed "s|hoge|$PWD|g" < file1.txt > file2.txt >>171
はやっ!ありがとー!
でもごめんなさい、実は明後日まで試せる環境がないので、
また試せたら報告に来ます。
sedでラベルを1行スクリプトに組み込むのは無理ですか?
sed '/^$/!{N;};/^$/{s/\n //g;}
Nが終わったあとにスクリプトの最初に戻したいのですが美味くいきません・・・ >>173
普通にできるけど。:label; hoge; b label みたいに。 報告おくれましたが、無事できました。
本当にどうもありがとう! >>177
>>173 の質問読み直せ。-e で連結する話とは違うぞ。
>>175 が正解。たぶん、>>173 はラベルの後のセミコロン忘れてできなかったんだろう。 省略せずに結果を書くと、
sed ':label;/^$/!{N;};b label;/^$/{s/\n //g;}'
↑な。これで何をやりたいかは知らんが。 >>178
ラベルの後に続けて書けるのはGNU含む一部のsedのみ。
だから普通じゃない。
普通はラベルごとに切って -e で繋ぐ。
sed -e ':label' -e '/^$/!{N;};b label' -e '/^$/{s/\n //g;}' タブ文字(0x09)だけをカンマに置換する方法はありますか?
バージョンはGNU sed の 3.02です。 普通に sed 's/ /,/g'
タブのところは、シェル上なら Ctrl-Vに続けて入力。
シングルクォート必須。
なお、上の sed をコピペしても、TABが表示上で変換されてるので動かないと思う。 >>184
T=`echo -ne "\t"`
sed -e "s/$T/,/g"
で出来ました。
ありがとうございました。 >>186
そんなことしなくても、普通に >>185 でできるわけだが、、
何をわざわざ大変なことしてるだよww >>185 では動きませんでした。よく知りもせず、確認もせずに回答しないでください。 >>187
あとで自分のシェルプログラムを読むときに
見えないタブコードのままだと誤解をしそうだし
Ctrl-Vという入力方式が使えない端末もあるので
あえて大層に書きました。 改行がCRLFをLFにするには、
sed -e 's/\r//' < target > out や
sed -e 's/^M//' < target > out
で出来るんだけど、逆にLFをCRLFにするにはどーしたら良いですか?
sed -e 's/\r\n/\n/'
sed -e 's/^M^J/\n/'
sed -e 's/^M\^J/\n/'
いずれもだめでした。
sedは GNU sed 4.1.5版 です。
おお、ちょうどいい!もれも似たようなことで
CR/LFを<BR>にしたかったw
dクスでつ190-191 正規表現にマッチした文字列だけを出力したい というとき
たとえば文字列の前の方の数字だけ取り出すときは
sed -n "s/^\s*\([0-9]*\).*$/\1/p"
みたいに 正規表現にマッチした全体をマッチした部分で置換する
ようにやってたのですが、いちいち置換するのは 格好悪いので
部分\1だけ出力するような格好いい書き方ありませんか? perl -nle 'print $1 if /\b(\d+)/' >>194
GNU grep の -o オプションを使う。
ほかの grep だったらごめんなさいw
sedスレのつもりだったんだけど、まあいいや。ありがとん。 あるテキストファイルの1行目〜最終行の1000行前までを
取り出したいのですが、どのようにすればよいでしょうか?
(ちょうど tail -n 1000 tmp.txt で取り出せない部分を
簡単に得たいのですが) awk '{a[NR]=$0}NR>20{print a[NR-1000]}'
まちがえた。
sedでやっても美しくならないから、awkで
awk '{a[NR]=$0}NR>1000{print a[NR-1000]}'
sed -n '1h;1!H;1001,${g;P;s/[^\n]*\n//;h}' >>200
>>201
レスありがとうございました。大変助かりました。
今回はawkを使おうと思いますm(__)m
>>202
すみません、sedを覚えたての初心者なもので・・・ sed -n ':b;1001,${P;N;D};N;bb'
詰め 下のような行があったとして
command, --いろいろなコメント
command, だけ残して、--いろいろなコメント(--から後ろ)を全部削除
したいのですがどうすれば良いんでしょうか?
本を読んでもよくわかりません。どうかお助け下さい。
消えました!
ありがとうございました!>>209
ほんと助かりましたです。 質問ばかりで恐縮なのですが、もうひとつ質問があります。
line...$
な行があったとして、^line を見つけた時に、下のようにおしりに
HOGEな文字列を追加したい場合はどうすれば良いのでしょうか?
line... HOGE$
ほんと、勉強不足で申しわけありません。オライリー本を片手にやってる
のですが、どうしてもわかりません。 >>211
sed '/^line/s/\$$/ HOGE$/'
address について調べれ。 >>211 の $ は文字じゃなくて、正規表現の $ の意味ではないのかと >>212-213
ありがとうございました。
sed '/^line/s/$/ HOGE/'
でうまくいきました。addressについても勉強してみます! 仮ファイルを使わずに
入力ファイル自身を書き換えることは出来ますか? //exec($command,$arg);
とコメントアウトされた行をアンコメントしたいんだけど
sed 's/\/\/(exec\(\$command,\$arg\);)/\\1/' -i hoge.php
とかやっても思ったとおりに置換されない
(とか$とか/とかをうまくエスケープできてないだけなのか
どうなのかがよくわかんないんだけど、どこが間違ってる? sed -e 's@//\(exec(\$command,\$arg);\)@\1@' 教えて下さい。
例
12345kkk6789
23456kkk4321
32456kkk9876
のようなテキストファイルが複数あり、
各行のkkk以降(kkkも含めて)を削除したいです。
1日考えてダメだったので、だれかお助け願います。
sed -e '500,$d' の500の部分を変数にすることって出来ますか?
例えば、sed -e '$no,$d' みたいな感じで実行するとエラーになって困ってます。 >>222
シングルクォートをダブルクォートに変えてみな。 >>223
どうもです。
sed -e "$no,$d"という風に変更してみましたがダメでした…
そもそも変数を指定することが出来ないというオチなのでしょうか? >>224
あ、>>222 をちゃんと見てなかった。
$d は変数じゃなくて行末とデリートか。
なら、後ろの $ はエスケープが要るな。
sed -e "$no,\$d"
> そもそも変数を指定することが出来ないというオチなのでしょうか?
sed 自身が変数を解釈しているわけではない。
この場合は sed に引数を渡すシェルが処理をしている。
bash を例にとって説明すると >>222 の形式では
シングルクォートの中身は展開されずに
そのままの文字列が sed に渡される。
ダブルクォートにすると中身を展開するので
$no と $d を変数と解釈して設定された値に
入れ替わったものが sed に渡される。
この辺の挙動をちゃんと知りたいのならおまいさんが
使っているシェルの man を読め。 >>225
エスケープしたら一発で成功しました!
225さんの説明を読んで、また一つ理解が深まりました。
どうもありがとうございました! sedの置換について質問 (GNU sed 4.x)
タブ(\t)は置換できるのですが改行(\n)が置換できません。
例えば # cat a.txt
aaa
bbb
aaa(タブ)bbb
3行目の(タブ)区切りは置換できるけど1行目と2行目にマッチした文字を置換できません。
どうやったらできますか?
何をどう置換したいのだ?
sed のスクリプトのほうも示してほしいのだが a.txtの内容
----------
aaa
bbb
aaa bbb
----------
このa.txtを
----------
eee
fff
aaa bbb
----------
↑のように置換したい。
sed -i 's/aaa\nbbb/eee\nfff/' a.txt
これで出来ると思ったのですが出来なかったので。
どうやったらできますか? -e 's/^aaa$/eee/' -e 's/^bbb$/fff/' 訂正
a.txtの内容
----------
aaa
bbb
ccc
bbb
----------
このa.txtを
----------
aaa
bbb
ccc
ddd
----------
↑のように置換したい。
この文字は何行目にあるか不明だとして
一番下のbbbをdddに置換することはできますか? >>233
ほれ、解答だ
↓
sed -n '${p;q};:s; N;s/ccc\nbbb/ccc\nddd/;P;D;b s' >>234
sedじゃなくてもいいですけど、置換できますか?
>>235
エラーがでました。
extra characters at the end of q command >>236
俺のところではエラーにならないけどな。
わかりやすいように改行を入れるとこんな感じ
↓
sed -n '
${
p
q
}
:s
N
s/ccc\nbbb/ccc\nddd/
P
D
b s'
sed -n '${p;q;};:s;N;s/ccc\nbbb/ccc\nddd/;P;D;b s'