シェルスクリプトを書いていて、自己解決が困難な問題にぶつかりました。
テキストファイルを対象に、改行コードを含む文字列(複数行に渡る文字列)を検索
し、改行コードごと削除したい(行を連結したい)のですが、条件分岐をいれたり構
造化するのではなく、簡単にすむコマンドや記述方法ははないでしょうか。
例えば、
------- test.txt ------
test *
* test2
-----------------------
というファイルがあったとして、'\*\n \*'の部分を削除して1行にしたいのです。
よろしくお願いします。
perlを使うとうまくいきました。
perl -e '$_ = join("",<STDIN>); $_ =~ s/\*\s*\*//gs; print $_' < test.txt
もっとうまい方法がございましたらよろしくお願いします。
> テキストファイルを対象に、改行コードを含む文字列(複数行に渡る文字列)を検
> 索し、改行コードごと削除したい(行を連結したい)のですが、条件分岐をいれた
> り構造化するのではなく、簡単にすむコマンドや記述方法ははないでしょうか。
>> ------- test.txt ------
>> test *
>> * test2
>> -----------------------
>> というファイルがあったとして、'\*\n \*'の部分を削除して1行にしたいのです。
まず制約条件はどんな感じでしょうか?
/bin/sh だけですべて賄わなければならないのか、
古sed,古awkくらいなら使ってもよいのか、
perl/python/rubyのような重量級外部ツールを使ってもよいのか。
/bin/shだけだと条件分岐なしてのは無理だと思いますよええ。
while, read, if, case を駆使するしかないような。
重量級の代表 perlなら
perl -e 'undef $/; $_=<>; s/\*\n\s*\*//g; print;'
(ただしメモリ大食い、メガバイト級ファイルには不向き)
ただperl使うなら最初からそーしますよね普通…
sed,awkでも組めないことはないでしょうが
頭の体操以外の用途には向いてないような(∴仕事に使うべきでない)
--
kabe
"S" <umu...@anet.ne.jp> wrote in message
news:20040205131620....@anet.ne.jp...
>
> テキストファイルを対象に、改行コードを含む文字列(複数行に渡る文字列)を
> 検索し、改行コードごと削除したい(行を連結したい)のですが、条件分岐を
> いれたり構造化するのではなく、簡単にすむコマンドや記述方法ははないで
> しょうか。
>
> 例えば、
> ------- test.txt ------
> test *
> * test2
> -----------------------
> というファイルがあったとして、'\*\n \*'の部分を削除して1行にしたいのです。
sed -e '/\*$/N;s/\*\n \*//' test.txt
ってところではいかが?
#但し、2行以上続く場合は複数回繰り返さないといけません。
処理系依存の話は、fj.unixの「ディレクトリ内ファイル一括置換」あたりで…
At Thu, 5 Feb 2004 21:23:34 JST,
<ka...@sra-tohoku.co.jp> wrote:
>
> 重量級の代表 perlなら
> perl -e 'undef $/; $_=<>; s/\*\n\s*\*//g; print;'
ruby 的には↓かなぁ...(テスト{データ,sh}込み)。
#!/bin/sh
cat <<EOF | ruby -e 'print readlines(nil)[0].gsub(/\*\n\s*\*/,"")'
test *
* test2
EOF
perl -pe 'undef $/; s/\*\s*\*//g;'
#行中に * * が無いことが前提ですよね? R.田中二郎
それだと、まず最初の行が読まれてからundef $/;が実行されるので、最初の
行の行末と2行目の行頭に*がある場合は目的の動作にならないですよね。
# perl -pe 'BEGIN{undef $/} s/\*\s*\*//g;'
ni...@ics.nara-wu.ac.jp
S <umu...@anet.ne.jp> writes:
> 例えば、
> ------- test.txt ------
> test *
> * test2
> -----------------------
> というファイルがあったとして、'\*\n \*'の部分を削除して1行にしたいのです。
$ sh delete_pat.sh '\*\n \*' test.txt
test test2
---- delete_pat.sh ----
#!/bin/sh
pat=$1
shift
(echo %%; echo "$pat" | sed 's/ /" "/g' ) > lex.l &&
lex lex.l &&
cc -o lex lex.yy.c -ll &&
cat "$@" | ./lex
rm -f lex lex.yy.c lex.l
------------------------
lex cc が使えて、
カレントディレクトリが書き込み可で、
lex lex.yy.c lex.l というファイルが存在しない
というのが条件です。
神田敏広 <ca...@kgc.co.jp>
田中さん、nideさん、kabeさん、桐山さん、田村さん、神田さん、ありがとうござ
いました。
シェルスクリプトの中でdvi2ttyを呼び出しており、1行が折れて例に示した
test.txtのようになった出力をもとの1行に戻す方法を模索しておりました。
私の環境のdvi2ttyはwオプションで1行130文字までは折れずに表示してくれるので
すが、それ以上の文字数を指定するとエラーになります。130文字でも行折れが発
生するため、今回の質問になりました。
いろいろな実現方法があり、大変参考になりました。ありがとうございました。
rubyでもちゃんと処理できました。lexは今回初めて知りました。sedで複数行を扱
う手があるとは、素晴らしいです。
とりあえずは、
$ perl -pe 'BEGIN{undef $/} s/\*\s*\*//g;'
を使おうと思います。
元の目的によりますが,
<20040206103831....@anet.ne.jp>の記事において
umu...@anet.ne.jpさんは書きました。
> シェルスクリプトの中でdvi2ttyを呼び出しており、1行が折れて例に示した
> test.txtのようになった出力をもとの1行に戻す方法を模索しておりました。
dvi2tty はデータ抽出という目的ではなくて tty 上に簡易表示という
のが目的のソフトなので,幅が足りない場合は上記のようになるのと,
幅が広い場合は " " を(余計に)補ってくれたりします.
テキストが欲しい,という場合は latex2html 経由で,
というのも選択肢になる *かも* しれませんね.
--
∧∧
Zzz.. (- - )⌒⌒⊇~ 川口 銀河
############## ginga-fj-s...@ginganet.org