|
>>4462 お sed で何とかできるのかもしれませんが、わたしは sed をよく知らないので、 sh でやるならこんな感じで。 IFS='' buf='' use_buf=0 cat file.txt | while read -r line; do case $line in " "*) tmpline=`echo -n $line|sed 's/^ *//g'` buf="$buf$tmpline" use_buf=1 ;; *) if [ "$use_buf" = "1" ]; then echo "$buf" fi buf="$line" use_buf=1 ;; esac done if [ "$use_buf" = "1" ]; then echo "$buf" fi と思ったのですが、最終行が出ません。sh もよくわかってないわたしには解決 できませんでした (GNU bash, version 3.00.14(1)-release (i386-redhat-linux-gnu))。 perl を使ってよいなら perl -e 'undef $/; while (<>){s/\n +//g; print}' file.txt あたりで。 |
|
>>4465 68user > と思ったのですが、最終行が出ません。 あー、ループ部分がサブシェルになってるからか。 while read -r line; do ... done < file.txt なら OK ですね。 やはり sh でプログラムなんて書くもんじゃないと思う。誰か Sh Programming Considered Harmful を書いてください。 |
|
>>4466 68user 補足。Solaris の sh では > while read -r line; do > done < file.txt でもダメなようですね。 http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936 |
|
>> 4467 ありがとうございます。 > while read -r line; do > done < file.txt はやはりダメでした。 while read line; do done < file.txt としたら上手く動きました。 また、 tmpline=`echo -n $line|sed 's/^ *//g'` では、1行になるのですが、「-n」オプションが邪魔みたいで、上手く編集 できませんでした。 tmpline=`echo $line|sed 's/^ *//g'` としたら上手くいきました。 |
|
>> 4468 sed 一発で簡単にできるものなのでしょうか。 |
|
>>4469 お 完璧ではないですが、こんな感じで。 ------ sed -e '/^[^ ]\{1,\}/ { N } s/^\([^ ]\{1,\}.*\)\n \{1,\}\([^ ]\{1,\}\)/\1\2/g' file.txt ------ >>4468 お >while read line; do >done < file.txt >としたら上手く動きました。 これだけで動きますか? whileの前に exec 0<file.txt とか要りませんでしたっけ? >>4466 68user >やはり sh でプログラムなんて書くもんじゃないと思う。誰か > Sh Programming Considered Harmful >を書いてください。 私は、どの程度の事までをシェルスクリプトでやるべきか悩みます。 Perlとか使った方が絶対に効率が良かったりするのに、 何故かシェルスクリプトにこだわる人とかいるし・・・ (で、気がつくと自分以外に判らないスクリプトが出来上がっていると。) |