sed - 印刷と分岐

sed - 印刷と分岐

ファイル形式を表す文字列を含む入力ストリームがあります。テキスト以外のすべてのファイル形式を印刷したいです。またはPostScriptです(PostScriptはテキストファイル形式です)。次のsed式を試しました。

sed -n '/PostScript/pb; /text/!p'

ただし、これはエラーを返します。

sed: -e expression #1, char 14: extra characters after command

bpパターンの後に複数のコマンド(たとえば)を指定することが許可されていると思ったので、これは私を混乱させます。

次の式を使用して、目的の動作を取得できます。

sed -n '/PostScript/p; /PostScript/b; /text/!p'

/PostScript/式のパターンを繰り返さずに目的の動作を取得するにはどうすればよいですか?

答え1

コマンドグループを一緒に実行する一般的な方法(パターンマッチングなどの条件を適用する)は、コマンドを中括弧でグループ化することです。
GNUの使用sed:

sed -n '/PostScript/{p; b}; /text/!p'

sedどちらの場合も、グループ化とスクリプトの終わりに分岐がなく、他の行が削除されます。

sed -e '/PostScript/b' -e '/text/!b' -e 'd'

また記録のため:

bpパターンの後に複数のコマンド(たとえば)を指定することが許可されていると思います。

アドレスの編集コマンド(話すモードはコンテキストアドレスです)とs代替フラグgpおよび他のものwですno.

後者の構文は次のとおりです。

s/pattern/replacement/[flags]

つまり、フラグを組み合わせることができます(たとえば、gpまたは7w outfile)、電子の構文は次のとおりです。

[2addr] {editing command
editing command
...
}

つまり、コマンドは改行で区切る必要があります(場合によってはセミコロンで区切ることができます)。

答え2

POSIX的に:

$ sed -n '/PostScript/p; //b
/text/!p'

POSIXの定義正規表現が空の場合は、sed最後のコマンドで使用された最後のREが適用されたかのように動作する必要があります。


あなたのコマンドを使用するには、;BetweenpおよびbGNU sedと連携させるには、次のものが必要です。

$ sed -n '/PostScript/p; //b; /text/!p'

POSIX sedの場合、有効なブランチ名は//b;使用できません。;コマンド間の終端文字として改行文字を使用する必要があります。

関連情報