sed は [0-9]% で終わる行を削除します。

sed は [0-9]% で終わる行を削除します。

stdout-stderrを記録するスクリプトを作成しています。

ログには、次の複数のインスタンスが含まれています。

(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 52099 files and directories currently installed.)

[0-9]%- で終わる行を削除して行を次のようにするにはどうすればよいですか?

(Reading database ... 
(Reading database ... 52099 files and directories currently installed.)

私は様々な形を試しました。

sed -i '/[0-9%]$/d' ~/test/Log

...エスケープ%を含みますが、運はありません。私が見つけた例は見つかりません。

特にそれを使いたいですsed。どんなアイデアがありますか?


そのsed -i '/[0-9%]$/d' ~/test/Log行はテストファイルでは機能しているようですが、何らかの理由で実際のログでは機能しません。

私はこれを試しました/%$/d(テストファイルで動作することができます)。ログでは機能しません。

試しましたが、/[0-9]%$/dログファイルには何の影響もありません...


sedバージョン:

~ sed --version
sed (GNU sed) 4.2.2

ログパス~/test/Log


'/[0-9]%[[:blank:]]*$/d'変更ログもないようです。

出力に関してエラーはありません。ファイルを分類すると、正しい出力(行が削除されます)が表示されます。


メモ:

ファイルを開いたときに行が消えたことがわかりましたcat。エディタ(Sublime Text 3)でファイルを開いたときに行がまだ表示されました。

どこかにスワップファイルがあるかと再起動もしてみましたが、結果は同じです。

答え1

%括弧内にはあってはなりません。正しい実装は次のとおりです。
sed -i '/[0-9]%$/d' ~/test/Log

答え2

ファイルに制御文字 (具体的には ^M) があることがわかりました。

cat表示されません^M - しかしless...

出力はless次のとおりです。

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... ^M(Reading database ... 5%^M(Reading database ... 10%^M(Reading database ... 15%^M(Reading database ... 20%^M(Reading database ... 25%^M(Reading database ... 30%^M(Reading database ... 35%^M(Reading database ... 40%^M(Reading database ... 45%^M(Reading database ... 50%^M(Reading database ... 55%^M(Reading database ... 60%^M(Reading database ... 65%^M(Reading database ... 70%^M(Reading database ... 75%^M(Reading database ... 80%^M(Reading database ... 85%^M(Reading database ... 90%^M(Reading database ... 95%^M(Reading database ... 100%^M(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

「(データベース読み取り)」行は長い文字列(^ Mを含む)です。

この行を削除すると、行全体が削除され、sedその理由が明らかになりました。

sed文字列置換は、文字列の一部をチェックして行を分割するために使用できます。

これがうまくいく結果です(^ Mは文字列で\ rです)。

sed -i 's/(Reading database \.\.\. [0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. \r//g' ~/Desktop/Log
sed -i '/^\s*$/d' ~/Desktop/Log

行の指定された部分を「nothing」に置き換え、最後の行は「nothing」で行を削除します... したがって、結果は次のようになります。

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

より簡単な方法があると確信しています。しかし、グループ化({[0-9],[0-9][0-9],[0-9][0-9][0-9]})などを含む私の実験では何も機能しません。

数時間の混乱の終わりに、私は長い答えを喜んで受け入れます. :)


修正する

ユーザードンクリスティ同じ結果を達成するより効率的なソリューションがあります。

sed 's/.*(Reading/(Reading/'

(…彼が投稿すると受け入れを待ちます)

答え3

これは仕事ですgrep

grep -vE '[0-9]%$'

vは意味するVそう、Eは第二拡張正規表現。

答え4

ログファイルの末尾の「%」の後にスペース、タブ、またはその他の印刷されていない文字が続くことがあります。努力する:

 grep "Reading Database" ~/Test/Log | cat -A

(注:cat -AGNU猫が必要です。GNU sedがあるのでGNU猫があるとします。)

%その行の間に何もない場合は、$これを確認することです。この場合、sedスクリプトを次のように変更してください。

sed -i '/Reading Database.*[0-9]+%/d'

関連情報