sed
そういう機能を追加すると、既存のスクリプトが動作しなくなるから。
ポータビリティを失ってまで実装する必要がない。(それこそ、perlでもawkでも使えばいい) なるほど、参考になりました。
もし開発に参加できるなら参加したいと思っていたのですが
そのような理由ならそういったときはperlやawkに頼る事にします。 >>322
sedに正規表現perl互換モードを搭載すればいいだけなのにね GNU sedの-r みたいなので、perlモードがあればいいね。 >>321
gnu sed 拡張している人たちがいるからそのあたりに乗ってみれば? onigsedじゃダメなのか?
つーか、perl -pe でいいじゃん。
質問させてください。
sedでホワイトスペースを解除または増やす方法ってあるのでしょうか? sedで、
/pattern/r file
ってするとマッチした行の次にfileの内容が出力されますが、
その行の前に出力する方法はないでしょうか?
ちなみにマッチする行は1個しかありません。 sed -n -e '/pattern/r file' -e p ごめん、ダメだった。こっちで。
sed -n -e 'x;p;g' -e '/pattern/r file'
1行目の空行は無視して 1行めの空白はもう1段 | sed 1d で消せるけど……
入力の最後の1行出てなくない?
出てなかった。
sed -n -e 'x;p;g' -e '/pattern/r file' -e '$p'
という感じで最後の行を出力することは出来るけど
patternが最後の行の場合だけ、fileの内容が次行に出ちゃう。
自分はギブアップ いろいろありがとうございます。
sed 1個では難しいようですね。
patternより前とpattern以後に別けて、
間にfileをcatするしかないのかもしれません。 sed 2個ならなんとか
sed -e '$aEND' | sed -e '
$d
/pattern/{
r file
N
}
${
P
d
}' >>295 の例に似てますが、
バイナリファイル(1行めの)4バイトめを ASCII 文字 0x02 -> 0x03 に
変更するにはどうすればいいでしょう?
# sed -e '1s/^\(...\)\x02/\1\x03/' in > out
ではだめでした。
試した環境は FreeBSD 7.2 です。 >>341
(dd bs=3 count=1; dd bs=1 count=1 of=/dev/null; printf '¥003'; cat) < in > out >>341
sed -e "1s/^\(...\)^B/\1$(printf '\03')/"
でできんかね。^BはC-v C-b入力できるはず。 >>343
最初の3バイトに改行文字がない保証がないから一般的にはだめそうだな。
やっぱ行指向のsedでバイナリファイルを操作するのは無理があると思う。 \x02 などは GNU sed の拡張仕様でした。
# pkg_add -r gsed
# rehash
# gsed -e '1s/^\(...\)\x02/\1\x03/' in > out
でできました。 >>342-344 ありがとうございます。
>>342 の dd を使った方法は大変参考になります。
あと、
# sed -e '1s/^\(...\)^V^B/\1^V^C/' in > out
でもできました。
^V^B は <Ctrl>V<Ctrl>B 、
^V^C は <Ctrl>V<Ctrl>C です。 ひとつ、お聞きいたします。
Nコマンドって、最後の行で次行が読めない場合、何もせず終了、
のはずですよね。すると、
sed 'sed ':l;N;bl' <file>
とすると何も出力されないんじゃないかと思うんですが、
私の使っているGNU sed 4.1.5版だと<file>の全部を出力してしまいます。
つまり、「何もせず終了」じゃなくて、「デフォルト出力して終了」
になっているように思われるわけですが、これは、どうなんでしょうか。 yコマンドで"/"を対象に入れたいんですが出来ないんでしょうか
初歩的ですいません >>350
sed y,abc,ABC,
とかできるから、
sed 'y,ab/,ab%,'
もできる。 そうか、区切り文字変えられるのsコマンドばかりじゃないんですね。
どうもありがとうございました。 sedでシェルすくりぷとの行つなぎバックスラッシューを消して、繋ぐことできますか?
perlなら-pe "s/\\\n//g"でできます。
edでも、awkでもできれば、教えていただけませんか? sed -e ':lbl' -e '/[^\\]$/b' -e 's/\\$//' -e N -e 's/\n//' -e 'b lbl'
置換パターンに\nを許さない場合は
sed -e ':lbl' -e '/[^\\]$/b' -e 's/\\$//' -e N -e 's/
//' -e 'b lbl' 踊っているように見えて仕方がない
echo "000000$NUM" | sed -e 's/.*\(..\)\(..\)\(..\)/\1\2\3/'
sedでファイルのある部分までをファイル1、それ以降をファイル2に出力ってスマートにできませんか?
例えば100行のsample.txtというファイルで、
sed -e "50q" < sample.txt > sample1.txt
sed -e "1,50d" < sample.txt > sample2.txt
の様にするのは無駄におもえてしまいます。 sed -ne '1,50w sample1.txt' -e '51,$w sample2.txt' < sample.txt
とか?
split -50 sample.txt; mv xaa sample1.txt; mv xab sample2.txt >>360,361
ありがとうございました。勉強になります。 入力テキストを
1行目の内容 2行目の内容
2行目の内容 3行目の内容
:
最終-2行目の内容 最終-1行の内容
最終-1行目の内容 最終行の内容
という形(隣り合った行の値を空白で連結する)に変換するにはどう書けば
よいでしょうか。
sed -ne '1!p;$!p'
と通せば先頭末尾以外の行を2回出力できたので、
これを2行分ずつくっつければ出来そうなのですが…
¥n ってどのsedでも使えるんだっけ?
$ seq 1 10 | sed -ne '1!p;$!p' | sed 'N;s/¥n/ /'
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
seq 1 10 | sed -ne '1h;1!{H;x;s/\n/ /;p}' unixの基礎概念という本の中に
a 21
is 10
this 3
というtest.txtファイルに対して、
sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt
とすると結果は
21 a
10 is
3 this
になると書いてありましたが、実行してみると並びはかわりませんでした。 >>367
確かに。それじゃぁ一番左側の .* が、最長一致で行全体に一致しちゃうから、
並びが変わらなくて正解。
悪書の書名晒して。 久野さんらしくないミスだな。
確かに変わらないね。 >>367
真中の * の直前のスペース、
スペース2つじゃないの?
コピペするとスペースが1つとかになるので注意。 >>371
はいそれです。解説にも
「これはどう読むかというと、『入力行を任意の文字列1と、空白のならび2と、また別の任意の文字列3
にマッチさせ、それ全体を3、2、1の順でつなげたものに置き換える』という意味になる。」と書いてあります。 >>372
なら、>>370の指摘通りで、キミが間違っている。
× sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt
○ sed 's/\(.*\)\( *\)\(.*\)/\3\2\1/' test.txt 專ブラなら安価ポップアップでちゃんと表示されるのかな
>>373 >>372
紙面上に、└┘└┘みたいな感じでスペースの個数は明示してあるの?
明示してないなら紙面が悪いと思うが。 >>373
空白2個ならいけるのですか。
>>376
そういう、└┘└┘みたいな感じはなかったです。文字数的にも一文字分の感じ
ですし。編集上のミスかもしれませんけど。 >>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 オプション忘れて全部の行が表示されてしまったってオチだろな