sedコマンドに関するこのサイトで提供されている回答を使用して空白行を他の2行のコンテンツに置き換える際に問題が発生しました。これは、Mac OSでsedコマンドを使用した場合に発生しました(私にとっては10.6.7)。 ) 異なります。そうではないと思いますが、このサイトの他の人たちの考え方が違うのではないかと思っていました。
承認された回答:
シェルユーティリティの動作は、UNIXバリアント間でわずかに異なります。複雑な歴史を持つ多くのUNIXバリアントがあります。 POSIX標準やそのスーパーセットであるSingleUNIX仕様などの標準化の取り組みがあります。最近のほとんどのシステムは、POSIX:2001(Single UNIX Specificationバージョン3とも呼ばれます)を実装していますが、わずかな違いと多くの拡張機能があります。 Single Unix仕様はチュートリアルではありませんが、コマンドが何をしているのかをすでに理解している場合は、バージョン3を読むことができます。一部の機能が標準であるか、特定のシステムの拡張であるかを知るために、それを参照することができます。
UNIXユーザーの大多数はLinuxを使用しており、他のバリアントを使用したことはありません。 LinuxにはGNUユーティリティが付属しており、多くの場合、標準に対して多くの拡張機能があります。そのため、Linuxで機能するが、他のユニスでは機能しないコードがたくさんあります。これらの拡張機能に依存しているためです。
sedについては、すべてのシステムがサポートすることになっている最小値についてはsed Single Unix仕様を、実装がサポートするものについてはシステムのマニュアルページを、ほとんどの人が使用するものについてはGNUSedマニュアルを参照してください。
GNU sedの非標準拡張機能の1つは、一緒に実行される複数のコマンドをサポートすることです。たとえば、このGNU sedプログラムは、 a
を含むすべての行を出力します。 、ただし b
を変更します c
に 最初:
sed -ne '/a/ {s/b/c/g; p}'
{コード> および
}
は実際には個別のコマンドであるため、完全な移植性を実現するには、個別の行(ファイル内)または個別の -e
で指定する必要があります。 引数(コマンドライン上)。 {
の後にコマンドセパレータがない および;
の使用 コマンドセパレータとしては一般的な拡張機能です。 }
の前にコマンドセパレータがない あまり一般的ではない拡張機能です。これは標準に準拠しています:
sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'
これは非標準ですが、一般的に受け入れられています:
sed -ne '/a/ { s/b/c/g; p; }'
もう1つの非標準ですが一般的な拡張機能は、 \ n
の使用です。 s
の改行を意味します 置換テキスト(正規表現での使用は標準です)。移植可能な方法は、sedスクリプトにバックスラッシュ改行を含めることです。もう1つの一般的な拡張子は\+
です 、 \?コード> および
\|
正規表現では、1つ以上、多くても1つと交互を意味します。ポータブルな基本的な正規表現には、これらのどれもありません。たとえば、最初のコマンドは、空白の連続したシーケンスを改行で置き換える移植性のない方法です。 2番目のコマンドは標準に準拠した同等のものです。
sed -e 's/ \+/\n/'
sed -e 's/ */\
/'