▼スレッド
│
└◇1686:sedコマンド パラメータ* [のど飴] 11/30 23:17
├◇1687:Re:sedコマンド パラメータ* [はじめ] 12/01
│└◇1689:grep(BRE), egrep(ERE) [nil] 12/01
│ └◇1690:Re:grep(BRE), egrep(ERE) [はじめ] 12/01
├◇1688:Re:sedコマンド パラメータ* [MSだす。] 12/01
└◇1691:Re:sedコマンド パラメータ* [のど飴] 12/02
└◇1705:Re[2]:sedコマンド パラメータ* [な] 12/03
└◇1706:Re[3]:sedコマンド パラメータ* [な] 12/03
└◇1739:Re[4]:sedコマンド パラメータ* [のど飴] 12/07
└◇1801:Re[5]:sedコマンド パラメータ* [MSだす。] 12/17 <
cygwinをインストールして、DOS画面からスレッド一覧
sedコマンドを実行させる。
このとき、sedコマンドのパラメータに、「*」を入れると、
「直前文字の繰り返し」という本来の解釈を認識してくれていないみたい。
カンマ区切りで連続する空白文字を除去する場合、「sed -e 's/ *,/,'」としているんだけど。。。
処理させるためには、どうすればいいのか、誰か教えてください。
[PR] 使用環境を書くように習慣付けよう。[PR]スレッド一覧
#---------------------------
回答:「sed -e 's/ *,/,/g' 」とする。
実施例:
cmd.extにて
#--- ここから
C:\cygwin\tmp> type foo.txt
a ,b ,c
aa ,bb,c, ,d ,
a,aa,bbbb ,c ,ddd
C:\cygwin\tmp> sed -e 's/ *,/,/g' < foo.txt
a,b,c
aa,bb,c,,d,
a,aa,bbbb,c,ddd
C:\cygwin\tmp>
#--- ここまで
確認環境:
Windows 2000 Pro + SP4
% cygcheck -sl | grep '^(sed|cygwin)'
cygwin 1.5.5-1
cygwin-doc 1.3-6
sed 4.0.7-3
(※特記事項:
JEを入れています。りうさんほか、皆さんありがとう。)
はじめ
>% cygcheck -sl | grep '^(sed|cygwin)'スレッド一覧
>cygwin 1.5.5-1
>cygwin-doc 1.3-6
>sed 4.0.7-3
うう、本題で無いので恐縮ですが、微妙に正しくない気が…
http://www.kt.rim.or.jp/~kbk/regex/regex.html
http://www.mnet.ne.jp/~nakama/
http://www2.famille.ne.jp/~akio1998/l_grep.html#regular2
grep, egrep にもいろいろな実装がありますが、
egrep '^(sed|cygwin)' # 一般的に(POSIX)
grep '^\(sed\|cygwin\)' # GNU拡張
(BRE では |, \| が使えない)
>(※特記事項:JEを入れています。
Cygwin_JE を入れてないので未確認ですし、setup.ini には multi-byte
grep のパッケージが見当たりませんでしたが、まさか JE で grep の仕
様が変わってるわけではないですよね。
(それと cygcheck -cd | ... でいいと思うけど)
うわ、すいません。スレッド一覧
(1) grepの挙動について。
先にgrepと書いていた部分は、egrepです。
# 投稿時にコマンド行部分も copy&paste するべきでした。
したがいまして JE には関係ないはずです。
御指摘ありがとうございました。
(2) cygcheck について
御教示ありがとうございます。
#以前にもバージョン確認方法を教わったはず。
#同様の間違いを複数回するようでは駄目ですね。>私
ということで、オフトピックで申し訳ないですが、
nilさんに感謝を込めてお詫びと訂正でした。
>カンマ区切りで連続する空白文字を除去する場合、スレッド一覧
こういうことでいいのでしょうか
$ cat junk
abc , djkel , dkjkesa
$ sed 's/ *, */,/g' junk
abc,djkel,dkjkesa
$
これはCygwin の話題ではないような。
はじめさん、MSだす。さん、nilさん、レスありがとうございます。スレッド一覧
ご指摘の通り、Cygwinとは無関係の問題でした。
重ねての質問で恐縮なのですが、連続する全角の空白文字を除去する場合について
教えていただきたいです。
[使用環境]
windowsNT 4.0
[実行例]------実際に行ないたいのは「★」ではなく全角スペースです。
D:\>type D:\cygwin\a.txt
★,あいう★★★,えお★★,
か,き★★,★くけ★こ,
さ★★し,すせそ,★★,
D:\>sed -e 's/★*,/,/g' D:\cygwin\a.txt > D:\cygwin\b.txt
D:\>type D:\cygwin\b.txt
,あいう★★,えお★,
か,き★,★くけ★こ,
さ★★し,すせそ,★,
★1つ分だけが除去されている状態です。
試しにUNIX上で実行してみると。。。
---------------------
,あいう,えお,
か,き,★くけ★こ,
さ★★し,すせそ,,
---------------------
と狙いどおりになるため、cygwin上の問題ではないかと思います。
nilさんに教えていただいたサイトのひとつによると
「処理系によっては文字の繰り返ししか認めてみないものもあります。」
とありますが、半角の空白なら問題ないので、『認めてくれている』ものと考えています。
宜しくお願いします。
> 重ねての質問で恐縮なのですが、連続する全角の空白文字を除去する場合についてスレッド一覧
> 教えていただきたいです。
> ★1つ分だけが除去されている状態です。
cygwinのsedは日本語化/国際化されていませんので、
正しい動作です。
sed-jaやsed-mbなどを調べてください。
> と狙いどおりになるため、cygwin上の問題ではないかと思います。
違います。
> nilさんに教えていただいたサイトのひとつによると
> 「処理系によっては文字の繰り返ししか認めてみないものもあります。」
> とありますが、半角の空白なら問題ないので、『認めてくれている』ものと考えています。
日本語化/国際化されていないソフトウェアでは、全角空白は
0x81, 0x40 の二文字として扱われます。
正規表現で '*' は単一の正規表現式の繰り返しですので、
0x81 の後ろに 0x40 が繰り返された場合の指定になります。
あえてやるのであれば、sed -e 's/\(★\)*,/,/g' といった
あたりでしょうか。
ちょっと補足。スレッド一覧
> 日本語化/国際化されていないソフトウェアでは、全角空白は
> 0x81, 0x40 の二文字として扱われます。
全角空白が0x81,0x40になるのはSJISの場合です。
cygwinの話なので、SJISだと仮定していました。
> 正規表現で '*' は単一の正規表現式の繰り返しですので、
例に挙げられた sed -e 's/ *,/,/g' の場合には、
> 0x81 の後ろに 0x40 が繰り返された場合の指定になります。
なお、UNIXで期待した動作になったというのは、
最近の商用Unixではsedなどのユーティリティも
国際化されているためです。
また、VineLinuxなどでは、日本語化されたsedを
システムの標準にしている場合もあるようです。
なさん、ご返信ありがとうございます。スレッド一覧
原因とその背景が、すごく良くわかりました。
cygwinの問題というわけではなかったのですね。
にも関わらず、分かりやすい解答ありがとうございました。
最近気がついたのですが、スレッド一覧
http://www.sixnine.net/cygwin/index_ja.html
の"JE"にjsedが入ってます。