sed
そうか、区切り文字変えられるの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 オプション忘れて全部の行が表示されてしまったってオチだろな そんなことなくてその当たり前すぎる内容がわからない初心者さんなんでしょう。
回答してあげないなんてひどいね >>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を使っていたのと、
最長一致の正規表現も使っていたので混乱してしまいました。
「直後」を何度も言われていたのに、「直後『だけ』」に思いが至りませんでした。