grep 换行后的内容

grep for contents AFTER line break

我的文件sms.txt:

1 sender: 887645651201059711697
date:   15/02/04,08:07:08

Maaf, pulsa Anda tidak cukup untuk mengaktifkan Pkt Super Ngebut 11GB, 30hr, Rp55rb. Ayo isi pulsa di XL Center, ATM, Minimarket, Inet, m-Banking. Info 817

如何只打印短信内容?所以我希望输出是这样的:

Maaf, pulsa Anda tidak cukup untuk mengaktifkan Pkt Super Ngebut 11GB, 30hr, Rp55rb. Ayo isi pulsa di XL Center, ATM, Minimarket, Inet, m-Banking. Info 817

我尝试了 grep '\n.*' sms.txt 但没有成功。

尝试 sed:

sed -r '/^[0-9]+ sender:/d;/^date:\s+/d;/^\s*$/d' sms.txt >textonly.txt

以匹配日期和发件人 headers 的模式开头的行以及仅包含空格的行将被删除。

我相信这可以满足您的需求:

$ awk '/^$/{f=1} f && /./{print;f=0}' sms.txt
Maaf, pulsa Anda tidak cukup untuk mengaktifkan Pkt Super Ngebut 11GB, 30hr, Rp55rb. Ayo isi pulsa di XL Center, ATM, Minimarket, Inet, m-Banking. Info 817

工作原理

  • /^$/{f=1}

    每次遇到空行时,标志f设置为1。

  • f && /./{print;f=0}

    如果标志 f 非零且当前行不为空,则打印当前行并将 f 重置为零。

备选方案

正如 Jotne 在评论中所建议的,这里有另外两个 awk 实现相同目标的命令:

awk '!/./{f=1} f && /./{print;f=0}' sms.txt

awk '!NF{f=1} f && NF{print;f=0}' sms.txt

使用 sed

sed -r '/^( *[0-9]* sender:| *date:| *$)/d' sms.txt

编辑 : 或

sed -nr '/^( *[0-9]* sender:| *date:| *$)/! {p}' sms.txt

在我看来,您可以使用 grep 执行以下操作。

grep -Eo '^[^:]+$' sms.txt