単純なsedタブの交換が奇妙に失敗する

単純なsedタブの交換が奇妙に失敗する

これは非常に簡単なはずですが、何らかの理由で機能しません。

sed -i.bak -E 's/\t/  /' file.txt

タブを置き換える代わりにt文字を置き換えます。引用文など、私が考えることができるすべてのバリエーションを試しました。 Googleで見つけました。他の人非常に似た表現を使うことは彼らには効果があるようです。

これは-EOS Xの問題です。私はその失敗がOS Xの奇妙な性質のためかもしれないと思ったsedので、Rubyでも試しましたが(そうではありませんでした-i)同じ結果を得ました。

ruby -pe '$_.gsub!(/\t/,"  ")' < file.txt > file.new

私はOS XとiTermでBash 3.2.51を使用していますが、どちらがどれほど重要かを知りません。奇妙な環境変数セットはありませんが、関連性があると思われる項目を公開できます。

何が間違っている可能性がありますか?

修正する:Ruby版を試したときにGillesが指摘したので、他の間違いや誤字があったようです。する働く(そして私はいいえ彼が私を誤解させてください! )。何が起きているのかよくわかりませんが、私の間違いであるに違いないと確信しています。

ベストアンサー1

sedのタブ文字構文は\t標準ではありません。その脱出はGNU sed 拡張。多くの人がGNU sed(非埋め込みLinuxのsed実装)を使用しているので、オンラインでそれを使用する多くの例を見つけることができます。しかし、OS X sed他の* BSD sedと同様に、タブ文字はサポートされておらず、代わりにバックスラッシュが次のように\t処理されます。\tt

次のようなさまざまなソリューションがあります。

  • リテラルタブを使用してください。

    sed -i.bak 's/  /  /' file.txt
    
  • タブ文字を使用trまたは生成します。printf

    sed -i.bak "s/$(printf '\t')/  /" file.txt
    sed -i.bak "s/$(echo a | tr 'a' '\t')/  /" file.txt
    
  • バッシュを使ってバックスラッシュエスケープを許可する文字列構文

    sed -i.bak $'s/\t/  /' file.txt
    
  • Perl、Python、またはRubyを使用してください。公開したRubyコードスニペットが機能します。

おすすめ記事