ポータブルsed -e... dbまたは! Bについて?

ポータブルsed -e... dbまたは! Bについて?

存在するこれ編集する スティーブン・チャジェラス POSIXベース (再)式の分割と異なる式ステートメントをsed挿入して書式を設定します。これでコメントで理由を尋ねることができたようです。ありがとうございます。-e-e(削除されたコメントを見ると何を言っているのか分かります。)。そして私考える私はこれがなぜより一般的に役立つように表現されるべきかを十分に理解しています。だから希望は...

私は通常、可能であれば全体の表現を1に保つことを好みますが、sed -e次のことに従うことも好みます。仕様できるだけ近い。特に差がa<space>とan以下の場合はさらにそうです-e。しかし、理解していなければできません。なぜそうする必要があります。以下は、現在の理解の簡単な概要です。

  • 割り込みは、' -e 'コマンドラインステートメントでsedスクリプト\newline割り込みを置き換えることができます。sed私はなぜそれが混乱していることを認めます。

  • sed {関数の閉じ括弧の前には、次のように改行文字が続く必要が}あります。\n

    • <right-brace>前にaが来る必要があり、前後<newline>に文字が続くことがあります<blank>
  • \n以下を使用した後もewline割り込みが必要です。a、、、、、、、、、または。b​​​​​cirtw:

{ただし、関数定義がnot演算子}とどのように関連しているかは不明です。!仕様で私が見つけた否定演算子への唯一の言及は次のとおりです。

  • 関数の前には1つ以上の!文字が続く可能性があります。その場合、アドレスがパターンスペースを選択しない場合は関数を適用する必要があります。

これは中かっこを使うことを!意味しますか?コマンドはどうですか?区切り記号で区切る必要がありますか?ステファンが最近した質問ですか?{}$!' -e 'POSIX化私の答えは?

私はそれが!否定演算子であるか、b彼が編集で言及したranchステートメントであるか、どちらかだと思います。しかし、私はよく分からないので、そうしなければなりません。の場合ただbそれから牧場の声明私は信じるaはdそれを置き換え、' -e '休憩の必要性を排除しますが、3回の冒険を離れる前に確認したいと思います。POSIX化答え。助けてください?

私は危険を打った結局しかし、確実性はありません...

ベストアンサー1

これで、この質問に対する答えが得られます。直観で答えを得たけどどのようにほとんどすべての場合にこれを正しく実行するために、私は最近標準のテキストのかなり具体的な理解を深めることができました。実際には非常に簡単に説明されています。私は愚かなことを何度も見過ごしていたようです。

本文の関連部分はタイトルの下で確認できます。

  • 編集コマンドはsed:

    • 議論テキスト1 つ以上の行で構成する必要があります。\nテキストに含まれる各行の前には\バックスラッシュが必要です。テキストの他のバックスラッシュは削除する必要があり、次の文字は文字通り処理する必要があります。

    • rコマンド動詞wとコマンドwフラグはsオプションを取ります。rファイル(または仕事文書)引数、コマンド動詞文字、またはフラグで区切られた1つ以上<blank>s。実装では、拡張で空白を許可できます。

    • {、、、、、、、、、およびaその他のコマンド動詞の後には、セミコロン、オプション、およびその他bのコマンド動詞が続きます。ただし、コマンド動詞をフラグと共に使用する場合、この方法で他のコマンドを後で使用すると、未定義の結果が生成されます。cirtw:#;<blank>ssw

...存在する...

  • オプション:複数-eおよびオプションを指定できます。-fすべてのコマンドは、ソースに関係なく、指定された順序でスクリプトに追加する必要があります。

    • -e スクリプト- 指定した編集コマンドを追加スクリプト終了するオプションパラメータスクリプト編集コマンド。これスクリプトオプション・パラメーターには、オプション・パラメーターと同じ属性が必要です。スクリプトオペランド、説明:オペランド部分。

    • -f スクリプトファイル- ファイルに編集コマンドを追加スクリプトファイルスクリプトの最後まで。

ついに...

  • オペランド:

    • スクリプト- 使用する文字列スクリプト編集コマンド。申請はできませんスクリプトこれは、最後の文字がewlineである必要がないことを除いて、テキストファイルの制限に違反します\n

したがって、全体的に考えると、事前定義された区切り文字なしで任意の引数がオプションで続くことができるすべてのコマンドが意味を持ちます。s d sub d repl d flag例えば反対)エスケープされていない改行で\n区切る必要があります。

議論の余地がある; はい事前定義された区切り文字がありますが、この場合、forを使用するすべての;コマンド[aic]は、これら3つのコマンド専用の実装に別々のパーサーを含める必要があります。つまり、for に使用されるパーサとは別個です[:brw]。それ以外の場合、実装には次のものが必要です。; 返品バックスラッシュ内のエスケープテキストパラメータを指定し、そこからはより複雑になります。

もし私はsed互換性があり、効率的であることを望むプログラムを書いているので、別のパーサーを書かないことを願っています。ただし、[aic]ewlineにすぐに従わないと、\n構文エラーが発生する可能性があります。しかし、これは単純なトークン化の問題です。末尾の区切り記号の場合が一般的にさらに問題になる場合です。私はただ次のように書くでしょう:

sed -e w\ file\\ -e one -e '...;and more commands'

...そして...

sed -e a\\ -e appended\\ -e text -e '...;and more commands'

...最初のファイルは、次の名前のファイルを作成して記録するという点で非常によく似ています。

file
one

...2番目は現在の出力行にテキストブロックを追加します。

appended
text

...どちらも同じパラメータ解析コードを共有するためです。

そういう{ ... }意味で$!- まあ、私はそこから離れています。アドレスが前にある単一のコマンドは次のとおりです。いいえ機能ですが、アドレス指定コマンドのみです。ほぼみんなコマンド - インクルード{ 機能定義 }/one/受け入れるか、アドレスを指定するように指定されました/one/,/two/#コメントそして:タグ定義。アドレスは行番号または正規表現にすることができ、否定することができます!。だからすべて...

$!d
/address/s/ub/stitution/
5!y/d/c/

...標準によると、1つ;以上のコマンドが続く可能性がありますが、1つのアドレスでより多くのコマンドが必要で、各コマンドの後にアドレスを再評価する必要がない場合は、次の{機能を使用する必要があります。}

/address/{ s//replace addressed pattern/
           s/do other conditional/substitutions/
           s/in the same context/without/
           s/reevaluating/address/
}

...{同じ行では、閉じるドアは後に来ることができず、行の}先頭を除いて閉じるドアは来ることができません。}ただし、埋め込みコマンドの後にewlineが続いてはいけない場合は、\n関数の内部にある必要はありません。したがって、上記のすべてのs///代替項目(閉じ括弧を含む)の後には、セミコロンやその他のコマンドが便利に}なります。;

私はEwlineの区切り文字について話してきましたが、\n問題は-e式の文に関するものであることを知っています。しかし、これら2つは実際には同じで、重要な関係は次のとおりです。スクリプトリテラルのコマンドライン引数、またはこれらのいずれかを含むファイルで-[ef]あり、どちらもテキストファイルとして解釈されます。\newlineで終了することを指定)しかし、実際には必要はありません。終わり行に\n。これで合理的にできます。(私は希望)区切られた引数を推論する\0NULことはewlineを終了し、\nすべての呼び出し引数が少なくとも)とにかく、\0NUL区切り文字の1つが正しく機能します。

実際、実際には\標準でバックスラッシュでエスケープされた改行文字を指定する場合を除くすべてのケースが見つかりました。

sed -e ... -e '...\' -e '...'

...も動作します。すべての場合で - 繰り返しますが、実際には -\nエスケープされていない改行が必要です...

sed -e '...' -e '...'

...私にも効果がありました。上記の1つの例外は...

sed -e 's/.../...\' -e '.../'

...これは私のテストのどの実装でも機能しません。私はこれが戻ってくると確信していますテキスト文書の要件と事実s/// 来る区切り文字を使用すると、単一のステートメントが区切られたパラメータにまたがる理由はありません\0NUL

要約すると、以下は、複数のsedコマンドを作成する移植可能な方法の簡単な概要です。

次のいずれかに該当します[aic]

...commands;[aic]\
text embedded newline\
delimiting newline
...more;commands...

...または...

sed -e '...commands;[aic]\' -e 'text embedded newline\' -e 'delimiting newline' -e '.;.;.'

[:rwtb]どこでも範囲はい任意に選択できる (を除くすべての人に該当:しかし、区切り線\nいいえ。複数行を試す理由はありませんでした。商標[:tb]とともに使用されますが、複数行をw評価/指定するパラメータr[rw]ファイルsed挿入された改行がバックスラッシュにエスケープされている\n限り、パラメータは通常私がテストしたときに間違いなく受け入れられます\。それにもかかわらず、標準は直接指定されません。商標そして[rw]ファイルパラメータは次のように解析する必要があります。テキスト\nパラメータを区別することを除いて、最初の2つのパラメータのewlineは言及されていません。

...commands;[:trwb] parameter
...more;commands...

...または...

sed -e '[:trwb] parameter' -e '...'

...<space>上記はオプションです[:tb]

いよいよ…

...;address[!]{ ...function;commands...
};...more;commands....

...または...

sed -e '...;address[!]{ ...function;commands...' -e '};...more;commands...'

...上記のコマンドの1つ(除外して:また、少なくとも1つを受け入れてください。住所/正規表現/または行番号にすることができ、否定できますが、!単一の評価に複数のコマンドが必要な場合住所次に、{関数コンテキストを使用して中括弧を区切る必要があります。}関数には\newlineで区切られた複数のコマンドを含めることができますが、そうでない場合は、各コマンドを中括弧で区切る必要があります。

これが移植可能なスクリプトを書く方法ですsed

おすすめ記事