sedの動作はFreeBSDとLinuxで異なりますか?


12

私はLinuxとFreeBSDの両方を使用しています(具体的には、Debian LinuxとPC-BSDを使用しています)sed

「タブ区切り値」ファイルを「コンマ区切り値」に変換する必要が頻繁にあります。私が知っている最も簡単な方法はsed、次のように使用することです:

sed 's/\t/,/g' inputFile.txt > outputFile.csv

これはLinuxでは完全に機能します。すべてのタブをコンマに置き換えます...しかし、FreeBSDでは何も置き換えません!!!

何か不足していますか?sedLinuxの構文とは異なるFreeBSDの構文はありますか?

回答:


9

たぶん、GNU Sedとの互換性を保つために-Eオプションを使用する(またはマニュアルで-r説明されているよう)必要があります。あなたの場合、慣れているならGnu Sedをインストールできます(FreeBSDではport gsed)、またはスクリプトの移植には長い労力がかかります。

そして覚える。BSDのコマンドがそのユーティリティのgnuバージョンのように動作しない場合、それが壊れているという意味ではありません;)


1
ありがとうございました。-Eオプションは、(FreeBSD上でとMac OS Xの両方)のトリックを行います。
バランカ

私のFreeBSD 9では、-Eオプションは役に立ちません。
アークくん14

6

はい、さまざまな違いがあります。私が頭の外から知っている唯一の行動です-i

私はBSDを使用したことがないため、詳細を実際に支援することはできませんが、tr代わりに回避策を使用することもできます。

tr '\t' , < inputFile.txt > outputFile.csv

快適な副作用は、tr大幅に高速化されることです。Linuxで50000行のテストファイルを使用してテストしました。各行には2つのタブがありました。

$ time tr '\t' , < foo.txt > /dev/null 

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time sed 's/\t/,/g' foo.txt > /dev/null 

real    0m0.039s
user    0m0.036s
sys     0m0.000s

tr '\t' ,は、よりもポータブルですtr $'\t' ,tr '[\t]' '[,]'古いSysVシステムにも移植可能です。
ステファンシャゼル

tabはのデフォルトの区切り文字ですcut。のPOSIX仕様trあります。[古いSysVに必要なものが間違っていました。そのPOSIX仕様が指摘して[いるように、その範囲にのみ必要です。
ステファンシャゼラス

@StephaneChazelasだから、申し訳ありませんが、私はそれと何を混同しているのかわかりません。いずれにせよ説明をありがとう。
テルドン

4

はい、GNU sedFreeBSD とは異なり、正規表現sedなどのANSI Cエスケープシーケンスを解釈しません\t

この場合に最も一般的なdenomiatorを取得する1つの方法は使用することprintfです。

tab="$(printf '\t')"
printf '\t\n' | sed 's/'"${tab}"'/,/g'
printf '\t\n' | sed 's/'"$(printf '\t')"'/,/g'

sed -iインプレースファイル編集の動作は、スイッチまたはオプションが-iスイッチの直後に続く場合、互換性を持たせることができます。たとえばsed -i -e 's/x/X/g' file、GNU sedとFreeBSDの両方で動作しますsed

FreeBSDの最近のバージョンsed(FreeBSD 8.1以降)には、-rGNUとの互換性を高めるスイッチがありますsed

(さらに、sed正規表現でPOSIX文字クラスを使用すると、互換性も確保できます)。

代替案については、POSIX準拠のsed実装を参照してください。minised-小さく、安く、高速なSED実装


3

次のTAB代わりにリテラル文字を使用する必要があります\t

sed 's/    /,/g' inputFile.txt > outputFile.csv

別の質問に関するステファンのコメントを参照してください。

次の記事にも興味があります。

関連する部分を引用します。



正規表現の違い正規表現の構文は、SEDの異なるバージョン間で微妙に異なります。ほとんどの違いには、ASCIベルやフォームフィードなどの非表示文字との一致に使用される特別なエスケープパターンが含まれます。


0

ログイン後、次のアナウンスを確認して保存します。他にも役立つことを願っています

sed(1)を使用してファイルをその場で編集したいですか?さて、「foo」という名前のファイル内のすべての「e」を「o」に置き換えるには、次のようにします。

sed -i.bak s/e/o/g foo

そして、「foo.bak」という名前のファイルに元のバックアップを取得しますが、バックアップが必要ない場合:

sed -i '' s/e/o/g foo

-iオプションがして、既にカバーされても、
ジェフ・シャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.