私の印象はPOSIX仕様sed
i\
出力で先行スペースを望まない限り、コマンドの次の行のテキストを左揃えにする必要があります。
私のMacでは(BSD sedを使用して)クイックテストでこれが可能であることがわかります。いいえ必要:
$ cat test.sed
#!/bin/sed -f
i\
This line starts with spaces.
$ echo some text | sed -f test.sed
This line starts with spaces.
some text
$
しかし、この記録はどこにも見つからないようです。 POSIX仕様やsed
私のシステムのマニュアルページにもありません。
sed
移植したいスクリプトでこの動作を信頼できますか? 携帯性はどのくらいですか?
(記録があるかどこか?)
sed
(ボーナスの質問:に渡された固定行の先頭にスペースを強制的に挿入できますかi\
?)
ベストアンサー1
いいえ。しかし、先行スペースを避ける限り、スクリプトは移植可能です。なぜ?一部sed
はテキスト行から空白文字を削除するため、これを防ぐ唯一の方法は、前世紀のこのマニュアルページで説明したように、前のスペースを避けることです。1、2、サム
アーカイブを確認して読み取ると、同じことが適用されますBSD
sed
(OSX
コードをコピーしただけで拡張子ではありません)。man
ページ:BSD 2.11
非常に明確な:
(1)私\
テキスト
.......
で表されるパラメータテキスト'\'
1つ以上の行で構成され、最後の行を除くすべての行は隠された改行文字で終わります。テキストのバックスラッシュは's'
コマンド置換文字列でバックスラッシュとして扱われ、すべてのスクリプト行で発生する削除から初期スペースとタブを保護するために使用できます。
今、POSIX仕様のどこに文書化されていますか?ただ言う
パラメータテキストは1つ以上の行で構成する必要があります。テキストに含まれる各<newline>の前に<backslash>を付ける必要があります。テキストの他の<バックスラッシュ>文字は削除する必要があり、後続の文字は文字通り処理する必要があります。
下にスクロールすると基本的なそれは言う
コマンドラインで<空白>と<空白>文字を許可する必要があるという要件は、過去の慣行を明確に説明し、「初期空白[原文]とタブ文字が削除されないように保護する」というフレーズの混乱を排除するために、提案よりも明確になりました。 sedユーティリティのテキストを説明する多くの履歴文書に表示されます。 (すべての実装がコマンドラインでこれを許可しますが、テキスト行から<スペース>文字を削除することは知られていません。アドレスの前には先行する<スペース>文字)。
関連部分なので「バックスラッシュを使用できます。」この引用には含まれておらず、残りのフレーズは「初期のスペースを保護してください...」言うことはできません... 1
とにかく要約すると、一部の実装ではテキスト行からスペースを削除しました(そして一部はまだ実行します)。ただし、すべての実装が準拠する必要があるPOSIX仕様のため
テキストの他の<バックスラッシュ>文字は削除する必要があり、後続の文字は文字通り処理する必要があります。
挿入するテキストの行をインデントする移植可能な方法は、各行の先行スペースをエスケープすることであると結論付けることができます。
OSX
1:私はまた、人々がソースコードを変更せずにページの段落全体をBSD
変更する理由を理解していません。以前と同じ動作を得ますが、これを文書化するmanセクションはもう存在しません。man