Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

改行コードを含む文字列の置換

閲覧: 2 回
最初の未読メッセージにスキップ

S

未読、
2004/02/04 23:16:202004/02/04
To:
どこに質問すればよい変わらなかったのですが、不適当であれば、適当なニューズ
グループを教示していただけると幸いです。

シェルスクリプトを書いていて、自己解決が困難な問題にぶつかりました。

テキストファイルを対象に、改行コードを含む文字列(複数行に渡る文字列)を検索
し、改行コードごと削除したい(行を連結したい)のですが、条件分岐をいれたり構
造化するのではなく、簡単にすむコマンドや記述方法ははないでしょうか。

例えば、
------- test.txt ------
test *
* test2
-----------------------
というファイルがあったとして、'\*\n \*'の部分を削除して1行にしたいのです。

よろしくお願いします。

S

未読、
2004/02/05 0:41:382004/02/05
To:
自己解決しました。

perlを使うとうまくいきました。

perl -e '$_ = join("",<STDIN>); $_ =~ s/\*\s*\*//gs; print $_' < test.txt

もっとうまい方法がございましたらよろしくお願いします。

> テキストファイルを対象に、改行コードを含む文字列(複数行に渡る文字列)を検
> 索し、改行コードごと削除したい(行を連結したい)のですが、条件分岐をいれた

> り構造化するのではなく、簡単にすむコマンドや記述方法ははないでしょうか。

ka...@sra-tohoku.co.jp

未読、
2004/02/05 16:23:342004/02/05
To:
umu...@anet.ne.jp sed in <20040205131620....@anet.ne.jp>:

>> ------- 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

Tadamasa Tamura

未読、
2004/02/05 8:34:552004/02/05
To:
田村です。

"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の「ディレクトリ内ファイル一括置換」あたりで…

KIRIYAMA Kazuhiko

未読、
2004/02/05 9:21:152004/02/05
To:
桐山です。

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

TANAKA Jiro

未読、
2004/02/05 9:46:022004/02/05
To:
S <umu...@anet.ne.jp> writes:
:perl -e '$_ = join("",<STDIN>); $_ =~ s/\*\s*\*//gs; print $_' < test.txt

perl -pe 'undef $/; s/\*\s*\*//g;'

#行中に * * が無いことが前提ですよね? R.田中二郎

NIDE Naoyuki

未読、
2004/02/05 11:03:292004/02/05
To:
In article <87brod1t...@ace.nerimadors.or.jp>,

ji...@nerimadors.or.jp writes:
> perl -pe 'undef $/; s/\*\s*\*//g;'

それだと、まず最初の行が読まれてからundef $/;が実行されるので、最初の
行の行末と2行目の行頭に*がある場合は目的の動作にならないですよね。

# perl -pe 'BEGIN{undef $/} s/\*\s*\*//g;'
ni...@ics.nara-wu.ac.jp

ca...@xxx.kgc.co.jp

未読、
2004/02/05 19:58:112004/02/05
To:
んじゃ私は lex で。

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>

S

未読、
2004/02/05 20:38:312004/02/05
To:
もと質問者のSです。

田中さん、nideさん、kabeさん、桐山さん、田村さん、神田さん、ありがとうござ
いました。

シェルスクリプトの中でdvi2ttyを呼び出しており、1行が折れて例に示した
test.txtのようになった出力をもとの1行に戻す方法を模索しておりました。
私の環境のdvi2ttyはwオプションで1行130文字までは折れずに表示してくれるので
すが、それ以上の文字数を指定するとエラーになります。130文字でも行折れが発
生するため、今回の質問になりました。

いろいろな実現方法があり、大変参考になりました。ありがとうございました。
rubyでもちゃんと処理できました。lexは今回初めて知りました。sedで複数行を扱
う手があるとは、素晴らしいです。

とりあえずは、
$ perl -pe 'BEGIN{undef $/} s/\*\s*\*//g;'
を使おうと思います。


Kawaguti Ginga

未読、
2004/02/11 0:01:512004/02/11
To:
川口です

元の目的によりますが,

<20040206103831....@anet.ne.jp>の記事において
umu...@anet.ne.jpさんは書きました。
> シェルスクリプトの中でdvi2ttyを呼び出しており、1行が折れて例に示した
> test.txtのようになった出力をもとの1行に戻す方法を模索しておりました。

dvi2tty はデータ抽出という目的ではなくて tty 上に簡易表示という
のが目的のソフトなので,幅が足りない場合は上記のようになるのと,
幅が広い場合は " " を(余計に)補ってくれたりします.

テキストが欲しい,という場合は latex2html 経由で,
というのも選択肢になる *かも* しれませんね.
--
∧∧
Zzz.. (- - )⌒⌒⊇~ 川口 銀河
############## ginga-fj-s...@ginganet.org

新着メール 0 件