キャリッジリターン、LineFeed、およびSedアクション

キャリッジリターン、LineFeed、およびSedアクション

sedが1)では機能しますが、2)では機能しない理由を理解する必要があります。私に代替ソリューションを投稿しないでください。このフォーラムで見つけました。ポイント1)と2)に関して、sedの動作を理解するだけです。

1)sed -i s/\\r//g file.txt

od -c file.txtをチェックすると、sedが正常に削除されました。\ r

2)sed -i s/\\n//g file.txt

od -c file.txt の確認時に sed は削除されませんでした。\n

私の質問は、それがポイント2に適用されない理由を理解することです。代替ソリューションを公開しないでください。内部の仕組みを理解したいのなら、これです!

ベストアンサー1

~からGNU sed マニュアル - sed の仕組み

sed は各入力ラインに対して次のループを実行することで動作します。まず、sedは入力ストリームから行を読み込みます。末尾の改行を削除します。を選択してパターン空間に配置します。その後、コマンドが実行されます。各コマンドは、関連するアドレスを持つことができます。アドレスは条件付きコードであり、コマンドは実行前に条件が確認された場合にのみ実行されます。

スクリプトの終わりに達すると、-n オプションを使用しない限り、パターン空間の内容が出力ストリームに出力されます。末尾の改行が削除されたら、もう一度追加してください。。その後、次のループは次の入力ラインで始まります。

~からPOSIX仕様(ありがとうございます。スチールドライバーリンク用)

基本操作では、sedループは入力行を追加する必要があります。終了改行文字の減算、パターンスペースを入力します。一般に、D命令が最後のサイクルを終了しない限り、パターン空間は空である。その後、sedユーティリティは、アドレスがそのパターンスペースを選択するすべてのコマンドを順番に適用し、スクリプトの最後にパターンスペースを標準出力にコピーし(-nが指定されている場合を除く)、パターンスペースを削除する必要があります。パターン空間が標準出力または名前付きファイルに書き込むたびに、sed直後に改行文字が続きます。


長すぎます。入力レコード区切り文字(デフォルトでは改行)は、コマンドを実行する前に削除され、レコードを印刷すると再び追加されます。


ただし、特定の状況では改行文字を操作できます。いくつかの例を以下に示します。

$ # this would still not allow newline of second line to be manipulated
$ seq 5 | sed 'N; s/\n/ : /'
1 : 2
3 : 4
5

$ # here ASCII NUL is input record separator, so newline can be freely changed
$ seq 5 | sed -z 's/\n/ : /g'
1 : 2 : 3 : 4 : 5 :  

$ # default newline separator, so NUL character can be changed
$ printf 'foo\0baz\0xyz\0' | sed 's/\x0/-/g'
foo-baz-xyz-
$ # NUL character is separator, so it cannot be changed now
$ printf 'foo\0baz\0xyz\0' | sed -z 's/\x0/-/g' | cat -A
foo^@baz^@xyz^@

おすすめ記事