Bash は awk を使用してパターンの後ろのすべての文字を削除します。

Bash は awk を使用してパターンの後ろのすべての文字を削除します。

次の形式の入力ファイルがあります。

something here
somethingElseHere^[%-somestuff here
^[%-somestuff here

この文字は^[エスケープ文字です\x1b

だから私がしたいことは、^[bashスクリプトで最初に発生した後にファイルのすべての内容を削除することです。したがって、次のような結果が出ます。

something here
somethingElseHere

私の解決策は次のとおりです。awk -F "\x1b" {'print $1'}ただし、これは次のような出力を提供します。

something here
somethingElseHere
(empty line here)

したがって、最後の行の後に空の行を追加します。ただし、手動で削除すると追加のバイトが得られます。ファイルを最大\x1b文字まで読み込み、読み取ったすべての文字を別々のファイルに書き込むC ++プログラムを作成しましたが、AWKを使用すると、追加の行を削除してもC ++を使用した場合よりも1バイト多くの結果が得られます。

編集する:

AWKを使用するときに追加されたEOL文字ですか? C ++プログラムで作業するときはそれを追加しません。

修正する:

私はちょうどいくつかのコマンドを試しましたが、それを開くとほとんど動作しますviが、まだ余分なバイトがあり、それがどこから来たのかわかりません。

$hexdump -x file1
0000000    4329    706f    7279    6769    7468    6328    2029    3931
0000010    3939    4d20    6369    6f72    6f73    7466    4320    726f
0000020    6f70    6172    6974    6e6f    610a    6362    6564    6766
0000030    6968    6b6a    6d6c    6f6e    7170    7372    7574    7776
0000040    7978    534d    5020    4c43    4c58    6f46    746e    3020
0000050    3130    a8f8    4955    0a42                                
0000058

$hexdump -x file2
0000000    4329    706f    7279    6769    7468    6328    2029    3931
0000010    3939    4d20    6369    6f72    6f73    7466    4320    726f
0000020    6f70    6172    6974    6e6f    610a    6362    6564    6766
0000030    6968    6b6a    6d6c    6f6e    7170    7372    7574    7776
0000040    7978    534d    5020    4c43    4c58    6f46    746e    3020
0000050    3130    a8f8    4955    0042                                
0000057

bashで作成したfile1には追加0x0a(改行)が追加されました。

ベストアンサー1

これがGNUソリューションですsed

sed -z 's/\x1b.*//'

awkOPの意見に基づいた解決策は次のとおりです。

awk -F '\x1b' 'NF > 1 { printf "%s", $1; exit } 1'

改行で終わらないようにするには妥当な理由が必要ですが、プレーンテキストファイルは改行で終わらなければならないことを覚えておいてください。

おすすめ記事