POSIX sedでは、ピリオド(ドット)が複数行のパターンスペースの改行文字と一致していますか?

POSIX sedでは、ピリオド(ドット)が複数行のパターンスペースの改行文字と一致していますか?

GNU sedでは動作します。たとえば、これは複数行のパターン空間で2つの空白行と一致します(次をN使用して作成されます)。

/^\n$/

これは標準ですか?

答え1

はい。

基本/拡張正規表現

.角かっこ式の外部で使用されるピリオドは [n] [BE]RE で、NUL を除いてサポートされている文字セットのすべての文字と一致します。[]

多くのPOSIX正規表現の実装(たとえばgrepまたはsed改行文字が一致しないため、一致させることは難しくありませんが、入力区切り文字は改行文字であるため、.スキャンした文字列に一致させる改行文字はありません。

POSIXはgrep改行文字と一致できません。これは空の文字列と同義語ですgrepsed同様ですが、a はsed編集を実行したり、スクリプトコマンドに基づいて追加の入力を取得したり、これらの結果にはパターンスペースで発生しなくても改行文字を含めることができます。ただし、この場合は.ewlineが一致します\n

私が知る限り、POSIX実装がほとんどできないことが一つありますが、それは^改行文字の補完と一致します。これは\、バックスラッシュが角括弧式[で自分自身を表すためです]。したがって、\nエスケープは単に\andを意味しますn。正規表現にリテラル改行文字を含めることも一般的に構文エラーであるためです。paxこれは私が知っている唯一の例外ですが)、あなたはこれではありません。[^<newline>]持ち歩ける。

通常の実装ではこれを処理する必要があり"[$(printf '\1-\11\13-\377')]"ますが、これはマルチバイトのシナリオで一致を制限します。

また:"\(\([^[:space:]]*[[:blank:]$(printf '\r\v\f')]*\)*\)"しかし、これはちょっとおっぱいです。

しかし、あなたができることは、パターン空間のすべての改行文字を一時的に別の文字に置き換えることです。(もちろんその逆も同様)、その後、他の文字の報酬と一致します。

たとえば、

printf %s\\n "a a" "b b" "c c" |
sed -e 'H;1h;$!d;x;l' -e '# slurps input to last line - usually a bad idea'   \
    -e 'y/ \n/\n /;l' -e '# transliterates spaces and newlines at once'       \
    -e 's/[^ ]*//2;l' -e '# substitutes away 2cd sequence of not spaces'      \
    -e 'y/ \n/\n /;l' -e '# transliterates spaces and newlines again'

a a\nb b\nc c$
a\na b\nb c\nc$
a\na  c\nc$
a a\n\nc c$
a a

c c

その小さなスクリプトには4つのookコマンドがありますl。一つは、最後の行を見つけた後、毎回パターンスペースを変更することです。各look コマンドは、上記の最初の 4 つの出力行のいずれかに対応し、末尾の$文字で簡単に表示されます。

最後の3行は、デフォルトsedでstdoutに印刷されたすべての編集内容の結果です。空白文字の補数の2番目のシーケンスが置き換えられるため、2番目の行は完全に空です。sedこれは、入力改行文字を除く当時のパターン空間内のすべての文字と一致するため、2番目のシーケンスは、2番目の行全体から対応する項目を引いたものです。末尾の改行区切り記号。

重要なのは、これがうまくいくということです。なぜなら指す(またはより制限的な[角かっこ表現の]代替)改行文字と一致します。

関連情報