sed
>>376
> 「これはどう読むかというと、『...、空白のならび2と、...
って書いてあるんだろ?
>>378
それは、¥2 のこと。「スペース2個」のことじゃないよ。 >>378
正規表現を理解してないバカ発見。
任意の文字列 → \1
空白の並び → \2
別の任意の文字列 → \3
と言ってるだけのこと。それとスペース2つ書くのとは意味が違う。 任意の文字列の前か後ろの少なくともどちらかは、任意でない特定の文字・文字列(含^$)でないと困ったことになるということですね?
俺も前それで失敗した。 sedの話題はこっちへ
くれぐれもシェルスクリプトスレに書き込まないように! >>377
\2,\3がφで全体がマッチ
\1に行全体
一つ目が\([^ ]*\)ならよかった。 AAA BBB=111 CCC=111
この行の111を000に置き換えするのに
sed -e 's/BBB=111/BBB=000/'
とする以外にもっとスマートな書式を教えてください。
GNU sedです >>386
> sed -e 's/BBB=111/BBB=000/'
これじゃ、お題
> この行の111を000に置き換えするのに
を満たさない。
矛盾を含む質問に答えることは不可能。 >この行の111を000に置き換えするのに
この行のBBB=111だけをBBB=000にする書式でした
すいません。 スマートの基準がわからないけど、BBBが二度出現するのが嫌なら
sed -e 's/\(BBB\)=111/\1=000/' AAA BBB=111 CCC=111 DDD=111 EEE=1111 sed -e /BBB=/{'s/111/000/'}
シェルスクリプトスレで覚えたやり方 sed -e 's/<space><space>*/<space>/g' test.txt
って動かないんですが? EUCだとうまく動作しないのだが、これはデフォルトなのかな そもそも、EUCはそういうツールで不都合がないようにということで作られたわけで。
日本語独特の文節や漢字などに対応しない、というのはあるけど。 <space> ってそのまま打ってるってオチだろw 急に Windows 7 64 bit で ssed が使えなくなっま。 tab8のテキストをインデントを崩さずに半角スペースに置き換えるにはどうすればいいですか? エスパーすると質問者は手段はsedじゃなくても良いと考えてる >>410
それなら「expand -8相当の処理をsedでやるには?」って聞くでしょ。 >>414
expand を知らなかった、という可能性は。 >>415
というかexpandを知らなかったからこそ
「tab8のテキストをインデントを崩さずに…」みたいな
まわりくどい言い方で聞いたんでしょ。
だからsedに関係なくexpandを回答すれば回答として十分。 >>416
expandを知らないけどsedを使わなければならない理由があるんだよ! すっごく登場しにくくなったけど>>415さんが正解です。
>>409
エスパーさんありがとう。
皆さん混乱させてスイマセンでした。置き換えと言えばsedしか知らなかったので。 文字列unkoの行を見つけてから文字列chinkoの行まで表示
ってどうやればいいの? >>420
当たり前過ぎるから回答は控えるけど、
エスパーすると -n オプション忘れて全部の行が表示されてしまったってオチだろな そんなことなくてその当たり前すぎる内容がわからない初心者さんなんでしょう。
回答してあげないなんてひどいね >>421
あ、-n だけのことだったんですね。失礼しました。
>>422
そこまで初心者じゃないです。 初心者の土瓶口だけど、chinkoの前の行まで表示 ってのはできるの? >>425
/start/,/end/{/end/!p} >>426
いや、それは知ってるよ。
そういうことせずに直接○○の行の手前まで指定はできないのか聞いてるんだが >>428
startを含まず、endを含む場合
sed -n '1,/start/b; 1,/end/p' みんな1行野郎なの? スクリプトファイルは書かないの? >>430
スクリプト書くほどならperlで書いちゃう perlは英語のマニュアルが読めなくて挫折した。あんときperlがんばっとけばよかったorz DTPでテキストの整形するとき、いっぱい痴漢(←なぜか第一候補)するよ。 >>432
俺はPerlは書籍で覚えたな、ラクダとあと何かUnixツールとして使うための本 教えてください!
テキストファイルの最後にある空行を削除するにはどうすればいいですか?
$ sed -n ' 105,$p' Ga.inp
search.LowerE -3.000 # default=-3.000 (Hartree)
search.UpperE 20.000 # default=20.000 (Hartree)
num.of.partition 1200 # default=300
matching.point.ratio 0.67 # default=0.67
の様に、最後に無駄な空行のあるファイルがたくさんあって、一括削除したいのです。
ただし、途中にある改行は、ファイルの見やすさのために残しておきたいのです。
ed で言えば
$;?^.?;+,$d
で出来ると思うのですが、sed では';'や'+'が使えず、どうしてよいやら・・・
パターンスペースが
空行だったらホールドスペースに追加
空行でなかったらホールドスペースを出力後にパターンスペース出力
最後の連続空行はホールドスペースに収まったままで終わる。
とか考えてみたがあってるだろうか。
Nコマンドを使っていて必要な最期の行を全部すっとばしたことが、私にもありました >>437
多分やりたいのはそれだと思います。
具体的に同書けばいいのでしょう?
もうawkかなにかで済ましてるだろうけど練習
437とは違うやり方になった
sed -n -e '
:loop
/^\n*$/{
N
b loop
}
p
' >>440
ありがとうございます!
うまくいきました。
gsedですが、
ブラケット開きがあって、ブラケット閉じ以外のものが1つ以上あって、ブラケット閉じがある場合、
で、これどこがおかしいのでしょうか? ★☆が現れてくれないんですけど。
s/\[\([^\]][^\]]*\)]/[★\1☆]/g >>442
バックスラッシュが余計
sed 's/\[\([^]][^]]*\)]/[★\1☆]/g' ありがとうございます。
つまり、[ と ] の間にあるものはどんなものでも
「これは文字です」と宣言しなくてもいい(\が要らない)ということですか。
やってみます。ありがとうございました。 >>444
そうなんだけど、] の場合は、[^ の直後にある場合のみ
普通の文字の ] とみなすという仕様。( [ の直後でも同様) テキスト [aaa], [bbb] <あああ>の(アアア)と<いいい>の(イイイ)
欲しい結果 ★aaa☆, ★bbb☆ ★あああ☆の★アアア☆と★いいい☆の★イイイ☆
s/[<[(]\([^<>[]()][^<>[]()]*\)[>])]/★\1☆/g
予想はしたけど、まるで反応してくれません。
半角の約物3種類は欲張ったかなあ、と1つずつやってみているところです。 >>446
>>445 に書いてあること読めよ。
[^ の直後に ] を置かないと、普通の文字としては認識されないんだよ。
[^....] の中の .... の順番を変えろということ。 >>446
s/[[<(]\([^]<>()][^]<>()]*\)[]>)]/★\1☆/g >>447-448
ああ、すみません。言葉が足りませんでした。読んだ上でわざと変えてみたのです。 ごめんなさい。>>446は[]の中の[]に全部\を付けたつもりでした(このミスが大元ですね)
エスケープすればどの位置にあっても文字とするというsedを使っていたのと、
最長一致の正規表現も使っていたので混乱してしまいました。
「直後」を何度も言われていたのに、「直後『だけ』」に思いが至りませんでした。 gsed で、置換コマンドの s を間違えて a と入力したスクリプトを実行したら、
一行ごとにその行が挿入されていて笑ってしまった。
a コマンドなんて知らなかったわ。 gsed って置換するときにタグの数が合ってなくてもエラーが出ないのね。 質問があります
テキストファイルaaaの中身
<hoge>
abc
</hoge>
<hoge>
def
</hoge>
これを
<hoge>
def
</hoge>
のようにabcのタグだけ削除したい
sed -i "/^<hoge>\n abc\n<\/hoge>/d" aaa
これでは削除できませんでした。
改行を含む文字列を削除する場合どうしたらいいでしょうか? cat aaa | sed -e ':loop; N; N; !b loop; s/^<hoge>\n abc\n<\/hoge>//'
これで良いのかな? >>459-461
ありがとうございます
しかし削除できませんでした
ちなみにsedじゃなくて何でやったほうがいいでしょうか? >>463
はい。ありがとうございます。できればシェルスクリプトで書きたいので
PerlでもRubyでも何でもいいとは思いますがそれ以外でいいコマンドはありませんでしょうか? grep -n abc して、出てきた数字でsedスクリプト作っちゃうとか。 >>464
シェルスクリプトから呼び出せば良いんじゃないの?
sedだって所詮は外部コマンドだし。 >>482
sed -n -f hoge.sed <aaa
hoge.sed:
/<hoge>/b hoge
p
b end
:hoge
N
N
/<hoge>\n abc\n<\/hoge>/!p
:end
>>458
aaaがXMLならXMLパーサ(を使える言語)を使った方がいいと思う
/<hoge>/!b
:loop
$b last
/<\/hoge>/!{
N
b loop
}
:last
s/<hoge>[ \n\t]*abc[ \n\t]*\(<\/hoge>\)*//g すみません。教えて下さい。
テキストの最終行のあとに空白行を1行入れる、というのはどう書くのでしょうか。
iコマンドでは最終行の前に空白行ができてしまいます。 最終行の後なら
$ cat >> tmp
$
で十分であるようにも思うけどなぁ ああ、なるほど。いつか思い出して使うこともあるでしょう。ありがとう。 そうなんだけど、sedファイルの中に書き込みたかったんですよ。でも、ありがと optimized sed
http://www.commandlinefu.com/commands/view/11707/optimized-sed
巨大ファイル対象の場合は
sed '/foo/ s/foo/foobar/g' <filename>
が
sed 's/foo/foobar/g' <filename>
よりも効率がよいとの事ですが、どういう原理でそうなるんでしょうか "foo"の在る行だけを対象にするから?
どのみち見つけに行くんだから同じじゃん?と想ったり想わなかったり