• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ShellScriptでのsed)

ShellScriptでのsedの使い方とは?

このQ&Aのポイント
  • ShellScriptでのsedコマンドの使い方について教えてください。
  • 具体的な例として、日付と時間のフォーマットを変換する方法を教えてください。
  • また、sedコマンドのオプションや引数についても教えてください。

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

  • ベストアンサー
  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.1

s/'//g s/-\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)/ \1/ s/, / /g SEDで使える正規表現 http://www.kt.rim.or.jp/~kbk/regex/regex.html#SED

noname#95859
質問者

お礼

ありがとうございます。 助かりました。仕事はうまく進んでいます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ShellScriptの組み方3

    お世話になります。 数字をピックアップしようとしているのですが、どうもうまくいきません。 数字は 400 ----> aaa 500 ----> bbb x4xx ---> aaa x5xx ---> bbb 5xxxx -> ccc これに対し、下記のように組みましたが、変換できませんでした。 sed -e 's#^4\d\d#aaa#g' motemp98 >> motemp99 sed -e 's#^5\d\d#bbb#g' motemp98 >> motemp99 sed -e 's#^\d4\d\d#aaa#g' motemp98 >> motemp99 sed -e 's#^\d5\d\d#bbb#g' motemp98 >> motemp99 sed -e 's#^5\d\d\d\d#ccc#g' motemp98 >> motemp99 サジェスチョンをお願い致します

  • 内容によって2つのファイルに分ける(shellscript)

    仕事で、ファイルの内容をチェックして別々のファイルに仕分けることが必要になりました。どのようにshellscriptを組めばよいでしょうか? fileの内容 (注:\tはタブを示す) aaa1 \t bbbb \t 60 \t cccc \t 60 \t sssss aaa2 \t bbbb \t 15 \t cccc \t 15 \t sssss aaa3 \t bbbb \t 60 \t cccc \t 60 \t sssss aaa4 \t bbbb \t 15 \t cccc \t 15 \t sssss aaa5 \t bbbb \t 60 \t cccc \t 60 \t sssss aaa6 \t bbbb \t 15 \t cccc \t 15 \t sssss 60 \t .* \t 60を含むものは test_60.txtに集め 15 \t .* \t 15を含むものは test_15.txtに集めたいのです。 sed と 正規表現を使ってうまくいくのかと考えていますが、 前に進めません。 宜しくサジェスチョンをお願い致します。

  • shellscriptのコマンドの意味

    コマンドの意味を教えてください。 人の作ったshellscriptが動かなくて、デバッグを余儀なくされました。 しかし、UNIXがわかっていないものですから、宜しくお願い致します。 (1) line=`head -$i $filename | tail -1` (2) echo $line >> temp98; sed -e 's#.1..#ABC#g' temp98 >> temp99 $lineには、数字が入っています。例えば、7102 宜しくお願いいたいます

  • sed コマンド

    sedを使って、行の中の単語を修正しようとしています。うまくいきません。サジェスチョンをお願いできますか? やりたいこと:  (tab) xxxxx01 (tab) --->(tab) xxxxx01_aaa (tab) (tab) xxxxx02 (tab) --->(tab) xxxxx02_aaa (tab) (tab) xxxxx03 (tab) --->(tab) xxxxx03_aaa (tab) sed -e 's/ xxxxx0(\d) / xxxxx0\1_aaa /' file.txt > file2.txt エラーメッセージは、\1の参照が適当ではない、と言うものです。 宜しくお願い致します。

  • 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
  • UNIX:テキストファイルのNULLを空白に変換したい。

    お世話になります。 現在テキストファイルをOracleデータベースに取り込む処理を開発しております。SQL*Loaderを用いて、テスト.datを取り込もうとしたのですが、 ORA-01722: 数値が無効です。エラーが出てデータを取り込めません。 テスト.datの中身を見たところ、該当個所に下記のようにNULLが入っていました。 数値型のテーブル項目に、NULLを取り込もうとしてエラーになっています。 Oracleの場合、数値型では空白は取り込めるようですが、NULLは取り込めないようです。 ですので、テスト.datのNULLの個所を空白に変換する方法を調査しています。 sedや、awk、perlを使えばできるのでしょうが、私は詳しくないため 方法が思いつきません。 どなたか、sed、awk、perlに詳しい方がいれば、方向性のヒントだけでも お教えねがいますでしょうか。 環境: Solaris 9 ■テスト.dat od -c テスト.dat > テスト.txt ※ \t = タブ、\0= NULL $ head -10 テスト.txt 0000000 0 0 1 \t 0 1 0 1 \t 1 \t 0 1 0 1 \t 0000020 0 0 0 0 0 0 \t 0 3 7 \t 1 0 0 1 0 0000040 2 8 \t \0 \0 \0 \t \0 \0 \0 \0 \0 \0 \0 \0 \0 0000060 \0 \t \0 \t 0 0 \t 6 3 \t 0 0 \t 1 \t ■編集後のイメージ \0(NULL)の個所を、そのままスペース(空白)で置き換えたい。 0000000 0 0 1 \t 0 1 0 1 \t 1 \t 0 1 0 1 \t 0000020 0 0 0 0 0 0 \t 0 3 7 \t 1 0 0 1 0 0000040 2 8 \t   \t 0000060 \t \t 0 0 \t 6 3 \t 0 0 \t 1 \t よろしくお願いします。

  • sedコマンド 先頭に空白文字を含む行の挿入

    よろしくお願いします。 [やりたい事] linaxサーバで、行の先頭に空白を3個含む文字列aaaを、/tmp/abc.cnfの3行目に挿入したいですが下記[実施コマンド]ではうまくいかず、上手くいくコマンドラインを教えて下さい。 [実施コマンド] sed -e ”3i <space><space><space>aaa” /tmp/abc.cnf [/tmp/abc.cnf]の中身 △△△123 △△△456 △△△aaa ←コマンドで挿入したい △△△666 △△△777 よろしくお願いします

  • sedでカンマ区切りの列の置換を行いたい

    以下の様なファイルがあります。 sedコマンドを使用して、カンマで区切られたn番目のカラム目を 置換したい場合どうすればよいでしょうか。 "1","2","3","4","5","6" "1234","12","34567","abcd","efg","hi" "a c","d f","12 34","0","AAA","" "g i","j l","45 67","0","BBB","2021" "m o","p r","3 2 1","1","ABC","" "123","456","","abc","efg","hij" ①1カラム目以外置換(1カラム目以降削除) sed 's/\(.*\),.*,.*,.*,.*,.*/\1/g' test.csv ②最後の6カラム目以外置換(6カラム目以外削除) sed 's/.*,.*,.*,.*,.*,\(.*\)/\1/g' test.csv ③3カラム目を置換(3カラム目を「""」だけにしたい) sed -e 's/\(.*\),\(.*\),.*,\(.*\),\(.*\),\(.*\)/\1,\2,"",\3,\4,\5/g' test.csv とできたのですが、 表現がないというか、置換対象文字列の条件、表現が長いというか、全カラムを指定しているので、 少し、短くできないものでしょうか。 ①パターン sed 's/\([^,]*\),.*/\1/g' test.csv ②パターン sed "s/.*,\([^,]*\)$/\1/g" test.csv の様にできました。 ③パターン 思いう浮かばず これで、できているので間違いはないかとおもいますが、 どうなのでしょうか。 なにかいい案はないでしょうか?

  • sedを使用しないで改名する方法

    Windows2003 Serverでデーターを月1でデーターを取得するバッチファイルを使用しているのですがセキュリティポリシーでマイクロソフトが提供しているソフト、またはWSHかバッチしか使用できなくなり、sedの使用が出来なくなりました。 教えていただきたいのは、sedを使用せず改名をする方法が存在するのでしょうか? 現在の仕様 毎月1日に、前月分の1日から最新のデーターを取得する。 例:10月1日に実行の場合は、9月1日のデーターから最新まで取得 バッチファイル date/t > date.txt sed -e s/\//-/g date.txt > date1.txt sed -e s/[0-9][0-9]//1 -e s/[0-9][0-9]//2 -e s/[0-9][0-9]//2 -e s/-//g date1.txt > date2.txt FOR /F %%Y IN (date2.txt) DO SET YY=%%Y sed -e s/[0-9][0-9]//1 -e s/[0-9][0-9]//1 -e s/[0-9][0-9]//2 -e sed -e s/[0-9][0-9]//1 -e s/[0-9][0-9]//1 -e s/[0-9][0-9]//2 -e s/-//g date1.txt > date3.txt FOR /F %%M IN (date3.txt) DO SET DT=%%M if %YY%%DT%==0901 set MM=12 if %YY%%DT%==0901 set YY=08 if %YY%%DT%==1001 set MM=12 if %YY%%DT%==1001 set YY=09 if %YY%%DT%==1101 set MM=12 if %YY%%DT%==1101 set YY=10 if %DT%==02 set MM=01 if %DT%==03 set MM=02 if %DT%==04 set MM=03 if %DT%==05 set MM=04 if %DT%==06 set MM=05 if %DT%==07 set MM=06 if %DT%==08 set MM=07 if %DT%==09 set MM=08 if %DT%==10 set MM=09 if %DT%==11 set MM=10 if %DT%==12 set MM=11 mkdir c:\%YY%%MM% xcopy C:\"Program Files"\AAA\LOG\MAIN* c:\%YY%%MM% /d:%MM%-01-%YY%

  • 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