• 締切済み

参照ファイルを用いて、複数のテキスト置換を一括で行

参照ファイル(list.txt)を用いて、一括でファイルの中身(test.txt)を置換したいです。以下のようにワンライナーで書いたのですが、以下のようなエラーが出ました。 使っているのはMac Os10.15.5です。 何か問題があるのでしょうか? 間違っている点があれば教えていただきたいです。 sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' list.list | xargs -I{} sed -i '{}' test.txt sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o sed: 1: "/Users/owner/Desktop/DI ...": invalid command code o <list.txt> AAA aaa 111 222 abc efg ....

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

> 使っているのはMac Os10.15.5です。 自分は最近の MacOS 使ってないので確証はないですが、 > sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' list.list | xargs -I{} sed -i '{}' test.txt エラーメッセージ見る限り \t は使えません。というか \t は GNU sed 方言なので、やるなら sed 's/\([^[:space:]]*\)[[:space:]]\(.*\)/s|\1|\2|g/' list.list | xargs -I'{}' sed -i~ -e '{}' test.txt みたいに空白文字区切り扱いにするか、ほんとに tab code だけにしたいならコマンドラインでも生の tab を入れないといけません。最初の sed の結果だけ確認してみてください。 あと -i'{}' だと suffix or regex で sed が混乱しないですか? man sed の examples からすると -i .bak -e 's/... みたいにすべきですが、そういえば -i の仕様も FreeBSD と GNU の sed で微妙に違うんだったか。 OS による sed の仕様違いに依らずワンライナーにするなら sed 's/\([^[:space:]]*\)[[:space:]]\(.*\)/s|\1|\2|g/' list.list | sed -f /dev/stdin test.txt > test.new && mv test.new test.txt こうかな。/dev/stdin が使えない OS だと駄目だが。あとは list.list の行数があんまり多いと制限越えそう。

関連するQ&A

  • sambaで連携したファイルをLinuxからsedでの置換

    お世話になります。 sedを使って文字列の置換をしたいと考えています。 sambaでwindowsから連携したファイルに対して置換を行いたいのですが、うまく置換ができません。 Linux側の「GNOME端末」からファイルの中身をのぞくと、全角の箇所が文字化けしてしまっていました。どうやら原因はこれだと思うのですが、どうすれば文字化けしていてもうまく置換できるでしょうか? あるいはLinux側から見ても文字が化けないようにするにはどうすればよいでしょうか? 例)   test[Tab]2008年5月05日[Tab]あああ[Tab]aaaaa という文字列に対し、 sed -e 's/^.*\t.\(.*\)\t.*\t.*$/3\1/' test.txt というコマンドを実行したが、うまく置換されない。 ※test.txtは、文字列が格納されているファイル。 よろしくお願いいたします。

  • textファイルについて

    あるディレクトリーに test.txt aaa.txt があるのですが、 二つのテキストを開いて もし text.txtの3行目に http://www.goo.ne.jp/ があり aaa.txtの10行目にも http://www.goo.ne.jp/ があるとすれば aaa.txtの10行目を消したいのですが、 そんな事って可能ですか?? 色々考えたのですが、aaa.txtの10行目を消す時に 10行目を空にすると言う指定が出来なくて困ってます。 どうしてもaaa.txtの削除が出来ません。 参考までにスクリプトを載せておきます <?php $file_name = array("aaa.txt", "test.txt"); $list = fopen($file_name[0], "a+"); $delete_list = fopen($file_name[1], "r"); $listfile = file($file_name[0]); $listmax = count($listfile); $listfile = file($file_name[1]); $delete_listmax = count($listfile); if ($delete_listmax > 0){ for ($delete_line = 1; !feof($delete_list); $delete_line++){ $delete_lines = fgets($delete_list); $delete_lines = trim($delete_lines); if ($delete_lines){ if (is_file($file_name[0])){ for ($line = 1; !feof($list); $line++){ $lines = fgets($list); $lines = trim($lines); if ($lines){ if ($delete_lines == $lines){ //ここの部分がわからないです fputs($list, "あああ"); echo "O,K\n"; } } } } } } } fclose($delete_list); fclose($list); echo "\n終了\n"; ?> 詳しい方がいましたら宜しくお願いします

    • ベストアンサー
    • PHP
  • 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 よろしくお願いします。

  • xcodeのビルド時のエラー

    ご覧頂き有難うございます。 現在、opencvを使ってiPhoneアプリの開発を試みているところです。 環境-------- Mac OS 10.6 X Code 3.2 iOS SDK 4.3 open cv 2.2 ------------ http://iphone.moo.jp/app/ このサイトを参考にガウシアンフィルタのプログラムを 組んで実行すると以下のエラーが出ます。 ------------------------------------------------------------------------- Ld build/Debug-iphonesimulator/Test.app/Test normal i386 cd /Users/******/Desktop/Test setenv MACOSX_DEPLOYMENT_TARGET 10.6 setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/****/Desktop/Test/build/Debug-iphonesimulator -L/usr/local/lib -L/Users/keisukeyamamoto/Desktop/Test/../OPENCV -F/Users/*****/Desktop/Test/build/Debug-iphonesimulator -filelist /Users/*****/Desktop/Test/build/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/Test.LinkFileList -mmacosx-version-min=10.6 -Xlinker -objc_abi_version -Xlinker 2 -framework Foundation -framework UIKit -framework CoreGraphics -o /Users/*****/Desktop/Test/build/Debug-iphonesimulator/Test.app/Test ld: duplicate symbol _main in /Users/****/Desktop/Test/build/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/fastGaussian.o and /Users/*****/Desktop/Test/build/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/i386/main.o collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2 failed with exit code 1 Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2 failed with exit code 1 ------------------------------------------------------------------------- ググッても中々解決しなかったので質問させていただきました。 何卒宜しくお願い致します。 初心者ですので足りない情報があるかと思いますが、補足が必要な場合は すぐに対応します!

    • 締切済み
    • Mac
  • UWSCでテキストファイルを開いて表示したい

    UWSCでテキストファイルやExcelファイルを開きたいのですが、 FOPEN関数を使っても、たとえばテキストファイルを開こうと思っても開けません。 これはなぜでしょうか? すべてのパソコンでダメでした。 OSはXPSP3、7SP1、です。 UWSCのバージョンは最新のバージョン(4.8e1)です。 UWSC.EXEのあるフォルダに、「test01.txt」を作成し、 fid=FOPEN("test01.txt",F_READ or F_WRITE) と書いても、絶対パスで、 fid=FOPEN("C:\Users\user01\Desktop\uwsc\test01.txt",F_READ or F_WRITE) と書いても、ダメでした。 その一行しか書いてないのがダメな原因なのでしょうか? 「C:\Users\user01\Desktop\uwsc\test01.txt」は コマンドプロンプトやファイルを指定して実行、からは開けます。 アンチウィルスソフトは一時的にOFFにしてもだめでした。 OS(XPSP3)を再インストールして、ネットにつながず、 セキュリティソフトなしでやってみてもダメでした。 多分、自分が何か勘違いをしているのだと思いますが、 FOPEN関数は、ファイルを開いて表示するものだと思っていましたが 違うのでしょうか? Webで検索すると、他のみなさんは開いているようなのですが・・・ ファイルのIDを取得するだけではだめで、ほかの記述も必要ということなのでしょうか? ゆくゆくはExcelのファイルを普通に開きたいのです。 COMで開くような事例もあったので、それは試してみましたが、 Office2003のセキュリティの「中」設定が無視されて 開いてしまい、Auto_Openマクロも無視されたりで、 使いたくありません。 「中」設定のまま、「マクロを実行させるダイアログ」を 表示してExcelファイルを開きたいのです。 でもその前にということで、テキストファイルを試しにと思ったのですが テキストファイルすら開けません。 何度かWeb検索しても一向に手がかりがつかめません。 大変すみませんが、どなたがご存知の方がいらっしゃったら、 よろしくご指導くださいませ。

  • N行以上重複している行のみを表示したい

    ファイル(test.txt)の中身に以下のようにIPアドレスがランダムに並んでいて、 この中から、5回以上出現しているIPを抽出して表示したいです。 # cat test.txt 111.111.111.111 222.222.222.222 333.333.333.333 444.444.444.444 111.111.111.111 111.111.111.111 333.333.333.333 444.444.444.444 222.222.222.222 111.111.111.111 333.333.333.333 222.222.222.222 444.444.444.444 333.333.333.333 111.111.111.111 # cat test.txt |sort | uniq -c で、 出現回数と、そのIPが表示されました。 しかし「5回以上出現」という条件をつける方法がわかりませんでした。 単純に、5回以上出現しているIPだけを表示したいのですが、 uniq以外でも、awk sed などで、単純なコマンドでワンライナーで実現したいです。 どうぞアドバイスを宜しく御願いいたします。

  • エクセルにてテキストファイル読み込みでエラー  

    いつもお世話になっております。 テキストファイル (test.txt)をエクセルマクロにてセルへの読み込みを したいのですが、なぜか エラーになります。 Cells(n, 1) = buf  でエラーのようです。 理由がわかりません。 教えてもらえないでしょうか 普通の文章なら読み込みできるのですが =  を使っているとエラーがでるようです。 test.txtの画像を添付します。 エクセルのマクロの内容は次の通り Sub テキストファイルをセルに転記() Dim buf As String, n As Long Open "C:\Users\a\Desktop\test.txt" For Input As #1 Do Until EOF(1) Line Input #1, buf n = n + 1 Cells(n, 1) = buf Loop Close #1 End Sub

  • 複数パターンのsed文についての質問です。

    sedの使い方がよく分からない為、教えてください。 テキストの中で、同じパターンスペースに対して、 別の文字を置換させたいと考えています。 (一つ目のマッチングには、yyy 二つ目には、zzzなど) sed文ではコマンドブロックの書き方がわからないので、 sedスクリプトを別に用意してファイルを読み込ませた所、 うまくいきました。 sed -f test.sed test.txt しかし、第二段階として、置換文字列を変数にしたところ、 変数展開ができませんでした。実際には変数展開を考えているので、 困っているところです。 この問題を解決できるようなsed文(sed -e)か、sedスクリプトを 教えて頂きたく宜しくお願いいたします。 下記、テスト材料です。 一つ目のabcを $HOMEに、 二つ目のabcを $SHELLに置き換えたいです。 text.txt (編集元テキスト) ------------------ User yyyyy abc Pass zzzzz abc ------------------- test.sed(SEDスクリプト) --------------------- /User/{ N N s/abc/$HOME/ N N N s/abc/$SHELL/ } ----------------------

  • DOSバッチでUNIXテキストファイルの文字列置換

    お世話になります。 早速ですが、 「DOSバッチでテキストファイルの文字列置換を行うプログラム」がいろいろ紹介されていたので、 皆さんのプログラムを流用させていただき、勝手に継ぎ足したDOSバッチプログラムを以下の ように作りました。 このDOSバッチで置換されたテキストファイルに2つの問題が発生して困っています。 問題 1)UNIXテキストファイルの改行コードがLFからCR+LFに変ってしまう。     文字列置換した後にファイルサイズが大きくなっていたので発見しました。      問題 2)空白行がなくなる。     DOSプログラムでは、対応不可でしょうか?     やはり、sed,awk,WHS,power shell を使わないと解決しませんか? -(DOSプログラム f0.bat)------------------------------------------------------ ::** @echo off setlocal ENABLEDELAYEDEXPANSION set fname=%1 copy /b %fname% org >nul type nul >%fname% for /f "delims=" %%a in (org) do (set line=%%a&&set l=!line:abc=xxx!&&echo !l!>>%fname%) del org goto end :end exit /b 0 -(実行時の標準出力結果 list)----------------------------------------------- C:\>setlocal ENABLEDELAYEDEXPANSION C:\>set fname=t22.txt C:\>copy /b t22.txt org 1>nul C:\>type nul 1>t22.txt C:\>for /F "delims=" %a in (org) do (set line=%a && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=J0000000 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=HHH && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=519 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.98302 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.016114 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=0 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=abc && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>del org C:\>goto end C:\>exit /b 0 --(置換前 t22.org LF改行コード)-------------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 abc --(置換後 t22.txt CR+LF改行コード)----------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 xxxx ------------------------------------------ 皆さんのご意見、ご指導をお待ちしてます。

  • unixのfindコマンド

    unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。

専門家に質問してみよう