• 締切済み

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

参照ファイル(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