Linux 换行后内容的grep

Linux 换行后内容的grep,linux,bash,grep,Linux,Bash,Grep,我的文件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 如何仅打印短信内容?所以我希望输出如下:

我的文件
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

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

我相信这会满足您的要求:

$ 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

不起作用,我编辑了我的问题以使其更容易解决,请再次查看。不,输出与原始文件完全相同。这是两个建议答案中更便于携带的一个。我不会使用
/^$/
/./
。您可以使用
awk'!//{f=1}f&&/{print;f=0}'
,但我会使用
awk'!NF{f=1}f&&NF{print;f=0}'
@Jotne好主意。我在答案中添加了这两条消息。你的
sms.txt
是否只有一条消息,或者可能有多条消息?这是巧合——消息中很可能包含冒号。