sed
>>111
否定疑問文だから、英語で答えるなら
"No" が正解だろ。 >>111-113
Thank you all.
知恵と勇気と愛でなんとかしてみる 否定疑問文に
「んなことない」みたいな答え方はどうしたらいい? >>115
「んなことない」= "There is no such Japanese zither." このシリーズはなんとなく印象が悪いので手にとってないな。そういえば。 教えてください。
awk,sed,シェルを使い、カンマ区切りのファイルの1カラム目と2カラム目をキーに、
あるファイルに含まれる行を削除するにはどうすればよいのでしょうか?
例)
--aaa.csv--
111,222,333,444
555,666,777,888
999,000,111,222
--file1.txt--
111222
555666
の場合、aaa.csvより下記行のみほしい。
999,000,111,222
ご存知でしたら、ご教授ください。
よろしくお願いします。
>>128
sed 's/\(...\)\(...\)/^\1,\2/' file1.txt | egrep -f- -v aaa.csv >>129
突っ込みだけでスマン。それだと、
111,222999999999,333,444
なんていうのがaaa.csvにあると、これも削除されるぞ。
数字の桁数が自由か固定かあいまいな>>128がいけないんだが、
sedの置換先は /^\1,\2,/ みたいなんの方が安全と思う。
>>129-130さんありがとうございました。
大変、参考になります。
私の説明がいけなかったのですが、
aaa.csvの1カラム目と2カラム目は固定ではなく、自由です。
ですので、
--aaa.csv--
11111,2222,333,444
55,666666,777,888
のような場合もあるのです。
また、file1.txtのほうも固定ではなく、
--file1.txt--
1111111222
555666
2233333
とスペースが入っている場合すらあります。
度々で恐縮ですが、
ご存知でしたら、ご教授ください。
よろしくお願いします。
>>131
仕事で必要ならコンサルタントを雇いなさい。 職場のマシン、perlが入ってなかった・・・ orz この場合は、sedよりawkなんかな?
awkで書いてスピードアップのためのawkccしてしまうとか。
ご存知でしたら、教えてください。
Solarisのawkで、変数に対しての比較に正規表現が使えないのですが、
よい方法をご存知の方がいましたら、教えて下さい。
nawkなら、上手くいくのですが、awkでは無理なのでしょうか?
また、Linuxのawkなら、上手くいきました。
よろしくお願いします。
例)下記の場合、./test.shを実行すると、test.awkの正規表現を使用している部分[if ( $7 ~ HENSU )]
でエラーになってしまいます。
--------------------test.shの中身--------------------
#!/bin/sh
HENSU="3A"
cat testdt.txt | \
awk -f test.awk HENSU=${HENSU}
exit 0
-----------------------------------------------------
--------------------testdt.txtの中身--------------------
aaaaabbbbcccdddeeeeeffffffgg3Aggggghhhhhhhiiiii
-----------------------------------------------------
--------------------test.awkの中身--------------------
BEGIN{
FS="\t"
}
{
if ( $7 ~ HENSU )
{
print $0
}
}
-----------------------------------------------------
>>137
awk -f test.awk -v HENSU=${HENSU}
じゃね?
確認はできんが ある文字列を
現在時間+引数
に置換したいのですが、どのようにすればいいですか?
perlを使えば簡単なんだけど、職場のマシンでperl が入ってなかった(汗)
ちなみに、sed とawk は使えるみたいです。 >>139
引数によるけど、dateコマンドが使えてたら、OKでは。
$ date +%R
00:45
$ date --date '6 min ago' +%R
00:39
という感じで引数を与えるといけると思う 入力ファイルを書き換えることはできる?
% sed 's/ABC/abc/' input.txt > output.txt
よくある上のようなプログラム(と呼ぶのかな?)で、
出力をoutput.txt
じゃなくてinput.txt のファイル自身を書き換えたいんだけど、可能かな?
つまり、余計なファイルは出力させたくないんだよ。 >>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
ほんと助かりましたです。