こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

投稿日時 - 2020-08-03 11:26:27

QNo.9780759

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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 の行数があんまり多いと制限越えそう。

投稿日時 - 2020-08-07 22:57:30

あなたにオススメの質問