sedで長いファイル名が使えないときの対処法

このQ&Aのポイント
  • WindowsNT4.0で、アスキーのMS-DOS SoftwareToolsに入っていたsedを今まで使っていましたが、長いファイル名が使えないのでsed32に切り替えようとしています。しかし、sed32ではエスケープ文字を正しく判断してくれず、タブが誤って置換される問題が発生しています。
  • sed32を使っていなかったため、正しい使い方が分からない可能性もあります。また、GNU sedの仕様によるものかもしれません。
  • 以前使っていたMS-DOS SoftwareToolsではこの問題は発生しなかったため、sed32のバージョンアップによる仕様の変更かもしれません。
回答を見る
  • ベストアンサー

sedなんですが…

perlのことでなくて済みません、が、sedのこととも共通している のではないかと思い、質問させていただきます。 WindowsNT4.0で、アスキーのMS-DOS SoftwareToolsに入っていた sedを今まで使っていましたが、長いファイル名が使えないので sed32に切り替えようとしていますが、エスケープ文字を判断し てくれないようで困っています。 以下に実行例を示します。 C:\TEMP\call>sed32 -V GNU sed version 3.02 + multi-byte extension 1.07 Copyright (C) 1998 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. C:\TEMP\call>sed32.exe -e"s/\t/TAB/g" e2.txt > e2.out e2.txtの内容 ------------------------------------------- select SWK_DENDATE "計上日付", SWK_DENNO "伝票番号", SWK_MCN_CODE "資産code", '' "資産名", nvl(SWK_GYOTEK, SWK_TEK) "摘要", ------------------------------------------- e2.outの内容 ------------------------------------------- selecTAB SWK_DENDATE "計上日付", SWK_DENNO "伝票番号", SWK_MCN_CODE "資産code", '' "資産名", nvl(SWK_GYOTEK, SWK_TEK) "摘要", ------------------------------------------- タブを"TAB"に置換せずに、"select"の"t"が"TAB"に置換されています。 しばらくこの手のtoolを使っていなかったので、よく分からない のですが、どこか使い方が間違っているのでしょうか? それとも、GNU sedの仕様なのでしょうか? SoftwareToolsでは問題ありませんでした。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ご質問にあるsedは使っていませんが...。 sedの種類によって"\t"が使えるのもと使えないものがあるみたいですね。(オリジナルのsedでは使えなかったと思うので、使えるのもののほうが「拡張」されているといえると思います。) この場合は、スクリプト中に本当のタブコードを入れるのが本来の方法だと思います。(\tを入れるところで本当にTabキーを押す。) 最後に参考までに、perlが入っていれば、 perl -pe "s/\t/TAB/" e2.txt で同様のことができます。こちらの"\t"は問題なく使えるはずです。

umatra
質問者

お礼

ありがとうございます。 やはり仕様でしたか。 jperlを試してみました。 -pをつければ、手元にあるsed用のスクリプトがほぼそのまま使えそうです。 perlに乗り換えるいいきっかけになりました。

関連するQ&A

  • DOS版sedでの行末処理について

    DOS版sedで行末文字を置換したいのですが、うまくいきません。 テキストの行末にある半角「L」を全角「」」に差し替えたく、以下のようにやってみましたが、置換が行われません。 sed -e "s/L\$/」/" 入力ファイル名 >出力ファイル名 sedはVectorからダウンロードした 「sed 1.18+mb1.03 フリーソフト マルチバイト文字対応版 GNU sed (96.06.10公開 59K) 」 を使用。 テキストはWindowsで生成したものです。 OSはWindowsXP SP3。 御教授よろしくお願いします。

  • sedやperlでの2バイト文字を含む変換

    こんにちは。 sedコマンドは、texに付属していた日本語対応のものを使用しており、 perlはWindows用のActive Perl v.5.12.2を使用しています。 カレントディレクトリにあるファイルやフォルダにおいて、 名前を一括して変換したいと思い、以下のようなNameConv.batというバッチスクリプトを作成しました。 ____________________________________________________________ @echo off for /f "delims=" %%a in ('dir /b !opt!') do ( for /f "usebackq delims=" %%b in (`echo %%a^| sed -e "s/%~1/%~2/g"`) do ( move /y "%%a" "%%b" 1>nul 2>nul if not "%%a"=="%%b" echo 「%%a」→「%%b」 ) ) ____________________________________________________________ このバッチスクリプトを NameConv.bat " " "_" の様にして呼び出すと上手く行きました。 (この場合は、カレントディレクトリの全てのディレクトリとフォルダの名前において、 スペースがアンダーバーに変換されました。) ところが、 NameConv.bat "スペース" " " のように、第一引数に変換文字列に2バイト文字を使用すると、 以下のようなエラーメッセージが出て上手く行きませんでした。 sed: -e expression #1, char 14: Unterminated `s' command どうやら、 echo %%a| sed -e "s/スペース/ /g" といったコードは、上手く行かなかったようです。 そこで、この問題を解決しようと、以下のようなNameRep.plというPerlスクリプトを作成しました。 ____________________________________________________________ #日本語を扱うために必要な設定 use encoding "cp932"; use open ":encoding(cp932)"; use open ":std"; map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/; #置換操作 $name="$ARGV[0]"; $name =~ s/$ARGV[1]/$ARGV[2]/g; print "$name"; ____________________________________________________________ そしてこのスクリプトを for /f "delims=" %a in ('dir /b') do ( @perl NameRep.pl "%a" "スペース" "_" ) の様にしてコマンドラインから呼び出すことで、「スペース」という文字列が、 きちんと処理できるかを試したところ、以下のようなエラーメッセージが出ました。 Unmatched [ in regex; marked by <-- HERE in m/\x{00d8}\x{00f9}\x{005b} <-- HERE \x{00d8}/ at C:\Users\kei\NameRep.pl line 11. どうやら $name =~ s/$ARGV[1]/$ARGV[2]/g; の部分で、$nameや$ARGV[1]に2バイト文字が含まれていると、上手く行かないようです。 #日本語を扱うために必要な設定 以下のコードブロックで、シフトJISに対応できるはず(少なくとも今までは問題なく扱えました) なのですが、何故か上手く行きません。 そこで、sedコマンドやperl、特にperlにおいて、シフトJISコードでの2バイト文字の扱い方を御存じの方に、何かアドバイスを頂きたいと考えています。 長くなりましたが、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • C言語 バイナリファイルをfloatにしたいのですが…

    16進数で表示すると以下のようなバイナリファイルがあります。 42 b9 e0 a4 3b df ea c0 3a 70 eb dc 37 7c f4 8c これを4バイトずつfloatに入れて出したいのですが、 本当はこのように出したいのですが、 [0][92.93875] [1][0.0068334043] [2][9.190419E-4] [3][1.50773085E-5] このような値がでてしまいます [0][-9.745835E-17] [1][-7.339750E+00] [2][-5.301601E+17] [3][-3.766891E-31] ソースはこれです。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp; long size, n; float *buf; int i = 0; if (argc != 2) return 1; /* FILE OPEN */ fp = fopen(argv[1], "rb"); if (fp == NULL) return 1; /* FILE SIZE */ fseek(fp, 0, SEEK_END); size = ftell(fp); rewind(fp); printf("FILE SIZE %ld\n", size); /* FILE READ */ buf = malloc(size); if (buf == NULL) return 1; n = fread(buf, 1, size, fp); /* FILE PRINT */ for(i=0;i<10;i++) { printf("[%d][%E]\n", i, buf[i]); } return 0; } 本日一日調べましたが良くわかりませんでした。 開発環境は以下の内容です。 $ uname -a Linux fedoracore6 2.6.20-1.2962.fc6 #1 SMP Tue Jun 19 19:27:14 EDT 2007 i686 athlon i386 GNU/Linux $ gcc --version gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 何かお知恵を拝借出来ないものでしょうか?? よろしくお願い致しますm(_ _)m

  • 各行末にサーバのホスト名を代入したいと考えています。

    各行末にサーバのホスト名を代入したいと考えています。 ただし数百台のサーバに置換しますので、 サーバ毎にホスト名を手動で変更しての置換はなしでお願いします。 環境: CentOS5.4 例) # cat aaa.txt aaaaaaaaaaaaaa bbbbbbbbbbbbbb cccccccccccccc => 代入後 # cat aaa.txt aaaaaaaaaaaaaa:hoge bbbbbbbbbbbbbb:hoge cccccccccccccc:hoge 私が作成したワンライナーは次の通りです 失敗) # for x in `hostname` ; do sed -e 's/$/:$x/g' aaa.txt ; done aaaaaaaaaaaaaa:$x bbbbbbbbbbbbbb:$x cccccccccccccc:$x どうにもわかりません。 よろしくお願いします。

  • CentOS5.2にPHP4.4.9をインストールしたいんですが。。。

    CentOS5.2にPHP4.4.9をインストールしたいんですが。。。 $ tar -zxvf php-4.4.9.tar.gz; cd php-4.4.9 ファイルを展開した後に $ ./configure --with-apxs2=/usr/bin/apxs --enable-mbstring --with-mysql --with-gd --with-jpeg=/usr/lib --with-png=/usr/lib を実行しましたが。 # ./configure --with-apxs2=/usr/bin/apxs --enable-mbstring --with-mysql --with-gd --with-jpeg=/usr/lib --with-png=/usr/lib loading cache ./config.cache checking for egrep... grep -E checking for a sed that does not truncate output... /bin/sed checking host system type... i686-pc-linux-gnu checking for gcc... no checking for cc... no configure: error: no acceptable cc found in $PATH このようになってしまい何をしていいか分かりません。どなたか教えて下さい。 参考URL http://d.hatena.ne.jp/donbulinux/20090304/1236160239

  • VBAでオーバーフローが出て困っています(エクセル2000です)

    自動売買ロボット作成マニュアルという本のなかに株価をダウンロードするためのプログラムとしてソースが書かれているのですが、オーバーフローとなってしまい、実行できません。lastrow = (Range("B4").End(xlDown).Row + 1)のところでオーバーフローを起こします。この文章だけでは対処できないと思いますのでプログラムを写します。 恐れ入りますが、お助けください。 Sub Calc() Dim code As String Dim data_length As Integer, date_temp As Date Dim day_s As Integer, month_s As Integer, year_s As Integer Dim day_e As Integer, month_e As Integer, year_e As Integer Dim row_length As Integer code = input_temp(2) data_length = -100 date_temp = DateAdd("d", data_length, Now) day_e = Day(Now) month_e = Month(Now) year_e = Year(Now) day_s = Day(date_temp) month_s = Month(date_temp) year_s = Year(date_temp) Range("B4:R65000").ClearContents For i = 0 To Abs(data_length) * 0.65 Step 50 If i = 0 Then lastrow = "4" For wtbl = 19 To 25 url = "URL;http://table.yahoo.co.jp/t?s=" & code & "&a=" & month_s & "&b=" & day_s & "&c=" & year_s & "&d=" & month_e & "&e=" & day_e & "&f=" & year_e & "&g=d&q=t&y=" & i & "&z=" & code & "&x=.csv" Call Get_Data If Range("B4") = "日付" Then Exit For Else Range("B4:H54").ClearContents End If Next Else url = "URL;http://table.yahoo.co.jp/t?s=" & code & "&a=" & month_s & "&b=" & day_s & "&c=" & year_s & "&d=" & month_e & "&e=" & day_e & "&f=" & year_e & "&g=d&q=t&y=" & i & "&z=" & code & "&x=.csv" lastrow = (Range("B4").End(xlDown).Row + 1) Call Get_Data Range("B" & lastrow, "H" & lastrow).Delete row_length = (Range("B4").End(xlDown).Row) If row_length - lastrow < 49 Then Exit For End If End If Next Range("B5:H65000").Sort Key1:=Range("B5") lastrow = Range("B4").End(xlDown).Row Range("B5", "B" & lastrow).NumberFormatLocal = "yyyy/mm/dd" Range("C5", "H" & lastrow).NumberFormatLocal = "0" Range("A1").Select End Sub Sub Get_Data() With ActiveSheet.QueryTables.Add(Connection:=url, Destination:=Cells(lastrow, 2)) .Name = "Yahoo" .FieldNames = False .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = wtbl .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .Refresh BackgroundQuery:=False End With End Sub

  • make の$(shell ) コマンドが動かない

    makefileに、以下のようなshell コマンドを記述しているのですが、端末によって(環境変数やmake、perl などのパスは同一)正常に実行されたり、エラーになったりします。 LIST = $(shell cat $(FILE) | perl -ne 'next if (m/^\#/); print $_;' | sed -n "s/\(.*\) \(.*\)/\1_\2/p" ) これはどうしてでしょうか? ----------- やっていることは、$FILE # comment key0 value0 key1 value1 ... というファイルからコメントを除いて、 key0_value0 key1_value1 ... のような文字列をつくって$LISTに渡しています。 ----------- エラーの場合、以下のメッセージが出ます。 perl -ne の部分がダメのようです。 ----------- Bareword found where operator expected at -e line 1, near "/usr/bin" (Missing operator before bin?) syntax error at -e line 1, near "/usr/bin" Execution of -e aborted due to compilation errors. ----------- なお、 LIST = $(shell cat $(FILE) | sed -n "s/\(.*\) \(.*\)/\1_\2/p") なら、端末によらず動作します。 make -version GNU Make 3.80 perl -version This is perl, v5.8.5 built for x86_64-linux-thread-multi 宜しくお願い致します。

  • netstatコマンドでセグメンテーション違反

    Linux初心者です。 くだらない質問かどうかさえもわかりませんが、困っています。 netstatコマンドを実行すると「セグメンテーション違反です」とだけが結果として表示されてしまい、 必要な情報が何も出力されません。 ---こんな感じ----------------------- [root@centos ~]# netstat セグメンテーション違反です ------------------------------------ とりあえず少しくらいは頑張ろうと、gdbでcore dumpを取ってみました。 (これが正しい原因調査方法かはわかっていません。) そして出てきた情報がこんなのです。 ---こんな感じ----------------------- [root@centos ~]# gdb netstat -c core.3166 GNU gdb Red Hat Linux (6.5-25.el5rh) Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"... (no debugging symbols found) Using host libthread_db library "/lib/libthread_db.so.1". warning: Can't read pathname for load map: 入力/出力エラーです. Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/ld-linux.so.2 (no debugging symbols found) Core was generated by `netstat'. Program terminated with signal 11, Segmentation fault. #0 0x00923ac0 in strcpy () from /lib/libc.so.6 (gdb) bt #0 0x00923ac0 in strcpy () from /lib/libc.so.6 #1 0x08051274 in strcpy () #2 0x081707a8 in ?? () #3 0x00000000 in ?? () ------------------------------------ 意味も分からず悪戦苦闘した結果、コイツ(/lib/libc.so.6)が悪さをしているのか?と 思ってきましたが、そもそも何者か?などがわからず、 viで開いてみてもなんだかバイナリファイルでギブアップでした。 どなたか、原因・解決方法をご存知の方がいらっしゃいましたらご教授ください。 ディストリビューションは CentOS release 5 (Final) ちなみに、そもそもの目的はipablesの設定をしようと思って、 内部ネットワークアドレス取得を行おうとしたところで思った出力が できなかったのが事の発端です。。。 ---iptabels----------------------- [root@centos ~]# vi iptables.sh #!/bin/bash #---------------------------------------# # 設定開始 # #---------------------------------------# # インタフェース名定義 LAN=eth0 #---------------------------------------# # 設定終了 # #---------------------------------------# # 内部ネットワークのネットマスク取得 LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` # 内部ネットワークアドレス取得 LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` ★★★ここ★★★ LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

  • sedについて

    下記ファイルをsedにて処理したいのですが皆様のお知恵をお貸し下さい ファイル 0,,,0,0,1,0,2,-50,0 上記ファイルの6番目,の前の1を0に書き換えたいのですが可能でしょうか? ファイルは,で区切られていて,の数と数字はランダムで変わりますので,のn番目の前の文字で検索出来れば良いのですが

  • SEDで教えてください。

    Perlのカテで申し訳ないのですが、SEDの記述で教えてください。 次のテキストの”ページ 105”以外の部分をすべて削除する処理の記述はどのようにしたらよいのでしょうか? ページの次の数字105は、いろんな数字が出てきます。 残す部分以外の文字列もいろんなものが出てきます。 ------テキスト--------------- あいうえお ページ 105:かきくけこ1000円さしすせそ。 たちつてと ------------------------------ ↓ -----処理後------------------- ページ 105 ------------------------------

    • ベストアンサー
    • Perl

専門家に質問してみよう