【问题标题】:Print paragraph if it contains a string stored in a variable (blank lines separate paragraphs)如果段落包含存储在变量中的字符串,则打印段落(空白行分隔段落)
【发布时间】:2021-03-06 05:17:25
【问题描述】:

我正在尝试在 /var/spool/mail/mysuser 文件中隔离邮件的标题。

如果段落包含 AAA,则打印段落(空白行分隔段落)

sed 在使用字符串“AAA”进行搜索时工作

$ sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' /var/spool/mail/mysuser

当使用变量时不起作用:

$ MyVar="AAA"
$ sed -e '/./{H;$!d;}' -e 'x;/$MyVar/!d;' /var/spool/mail/mysuser

=> 没有输出,因为单引号阻止了变量的扩展

尝试使用单引号

$ sed -e "/./{H;$!d;}" -e "x;/$MyVar/!d; /var/spool/mail/mysuser
sed: -e expression #2, char 27: extra characters after command

实际上,第一次搜索也不适用于双引号

$ sed -e "/./{H;$!d;}" -e 'x;/AAA/!d;" /var/spool/mail/mysuser
sed -e "/./{H;$!d;}" -e "x;/AAA/date;" /var/spool/mail/mysuser
sed: -e expression #2, char 9: extra characters after command

目前我也在考虑 awk 没有成功

有什么建议吗?

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    对于awk应该是微不足道的

    $ awk -v RS= '/AAA/' file
    

    有一个变量,需要一点点

    $ awk -v RS= -v var='AAA' '$0~var'
    

    或者如果它在别处定义

    $ awk -v RS= -v var="$variable_holding_value" '$0~var'
    

    【讨论】:

    • 谢谢,我没有阅读你的完整回复,这是一个干净的解决方案!
    【解决方案2】:

    这是因为单引号。需要去掉单引号才能启用插值:

    sed -e '/./{H;$!d;}' -e 'x;/'$MyVar'/!d;' /var/spool/mail/mysuser 
    

    或者,最好将变量放在双引号中:

    sed -e '/./{H;$!d;}' -e 'x;/'"$MyVar"'/!d;' /var/spool/mail/mysuser 
    

    【讨论】:

    • 非常感谢,正是预期的结果,awk 解决方案对我来说也很好!
    【解决方案3】:

    感谢 karakfa 它适用于:

    MyVar="AAA"
    awk -v RS= -v X=$MyVar '$0~X' file
    

    【讨论】:

    • 双引号"$MyVar",以防包含空格或特殊字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 2023-03-30
    • 2022-01-02
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多