grepから^ Mを含む行を除外することはできません。

grepから^ Mを含む行を除外することはできません。

Removed '2022-01-30_01-00-05'最後に抽出したい次のファイルがあります。

Removing '2022-01-30_01-00-05'...
  0.46% complete (00:03:45 remaining)^M  5.49% complete (00:00:17 remaining)^M 24.90% complete (00:00:06 remaining)^M 60.56% complete (00:00:01 remaining)^M 82.12% complete (00:00:00 remaining)^M 82.39% complete (00:00:01 remaining)^M 84.24% complete (00:00:01 remaining)^M 86.48% complete (00:00:01 remaining)^M 88.58% complete (00:00:01 remaining)^M 89.66% complete (00:00:01 remaining)^M101.08% complete (00:00:00 remaining)^M104.62% complete (00:00:00 remaining)^M                                                                                ^MRemoved '2022-01-30_01-00-05'

私はdos2unix成功せずにこれを試しました。

以下でこれらのバリエーションを試しましたが、そうしても文字がless output削除されないか、行^M全体がキャプチャされません。

tr -d $'\r' < /file | grep "Removed" > output
tr -d '^M' < /file | grep "Removed" > output
tr -d ^M < /file | grep "Removed" > output
sed 's/\r//g' < /file | grep "Removed" > output

ベストアンサー1

このgrepコマンドは一致する行全体を印刷し、* nixの行は\nおよびnotによって定義されるため、\r説明する内容は通常の動作です。つまり、最初のコマンドと最後のコマンド(thetr -d '\r'とthe sed 's/\r//g')はどちらも期待どおりに機能します。単にgrepが期待したタスクを実行し、行全体を印刷するだけです。

印刷のみ可能部分grep1行にはGNUとそのオプションが必要です-o。たとえば、

$ grep -oP "Removed\s*'[^']+'" file
Removed '2022-01-30_01-00-05'

または\r^M)を削除するのではなく、改行文字に変更してください。

$ tr '\r' '\n' < file | grep Removed
Removed '2022-01-30_01-00-05'

または

$ sed 's/\r/\n/g' file | grep Removed
Removed '2022-01-30_01-00-05'

おすすめ記事