如何使用命令行在第二次出现引号后删除所有内容?

Sam*_*ynn 8 command-line bash scripts text-processing

我在一个变量中有这家商店

   sCellEventTrap-03-28 TRAP-TYPE -- CAC 代码:00
        企业康柏
        变量 { scellNameDateTime,
                     scellSWComponent,
                     scellE代码,
                     细胞CAC,
                     细胞EIP}
        描述
             “严重性:正常——本质上是信息性的。在定期驱动器检查期间,物理磁盘驱动器遇到 ID 块不一致。”
           --#TYPE "StorageCell 事件"
           --#SUMMARY "SCellName-TimeDate %s : SWCID %d : ECode: %d : CAC %d : EIP %d。"
           --#ARGUMENTS {0,1,2,3,4,}
           --#SEVERITY 信息
           --#TIMEINDEX 136
           --#状态警告
        ::= 13600808

我要削减一切,直到第二次出现". 所以这会给我:

 sCellEventTrap-03-28 TRAP-TYPE -- CAC 代码:00
        企业康柏
        变量 { scellNameDateTime,
                     scellSWComponent,
                     scellE代码,
                     细胞CAC,
                     细胞EIP}
        描述
             “严重性:正常——本质上是信息性的。在定期驱动器检查期间,物理磁盘驱动器遇到 ID 块不一致。”

另一个例子

    genericSanEvent 陷阱类型
        企业 hpSanManager
        变量 {severityLevel, category, id,
                     msgString、联系人姓名、联系人电子邮件、
                     联系工作电话,联系家庭电话, 
                     联系寻呼机,联系传真 }
        描述
                        “发生了一般的 SAN 事件。变量是:
                            严重性级别 - 事件严重性级别;
                            category - 被报告事件的类别;
                            代码 - 给定类别中事件的 ID;
                            msgString - 描述的消息字符串
                                事件;
                            contactName - 个人姓名
                                被告知事件;
                            contactEmail - 电子邮件地址
                                联系人姓名中提及的个人;
                            contactWorkPhone - 工作电话号码
                                提到的个人的 
                                联系人姓名;
                            contactHomePhone - 家庭电话号码
                                提到的个人的 
                                联系人姓名;
                            contactPager - 的寻呼机号码 
                                联系人姓名中提及的个人;
                            contactFax - 个人的传真号码
                                 在contactName中提到”
     -- 以下是 xnmloadmib 用于改进格式的属性
     --#TYPE "OV SAM SAN 事件"
     --#SUMMARY "OV SAM SAN 事件,类别/ID:%d/%d,消息:%d 严重性:%d 联系人:%d"
     --#ARGUMENTS {1,2,3,0,4}
     --#严重性关键
     --#通用 6
     --#CATEGORY“应用程序警报事件”
     --#SOURCE_ID "T"
        ::= 1

此示例的输出应为:

    genericSanEvent 陷阱类型
        企业 hpSanManager
        变量 {severityLevel, category, id,
                     msgString、联系人姓名、联系人电子邮件、
                     联系工作电话,联系家庭电话, 
                     联系寻呼机,联系传真 }
        描述
                        “发生了一般的 SAN 事件。变量是:
                            严重性级别 - 事件严重性级别;
                            category - 被报告事件的类别;
                            代码 - 给定类别中事件的 ID;
                            msgString - 描述的消息字符串
                                事件;
                            contactName - 个人姓名
                                被告知事件;
                            contactEmail - 电子邮件地址
                                联系人姓名中提及的个人;
                            contactWorkPhone - 工作电话号码
                                提到的个人的 
                                联系人姓名;
                            contactHomePhone - 家庭电话号码
                                提到的个人的 
                                联系人姓名;
                            contactPager - 的寻呼机号码 
                                联系人姓名中提及的个人;
                            contactFax - 个人的传真号码
                                 在contactName中提到”

Joh*_*024 10

使用 awk:

awk -v RS='"' -v ORS='"' 'NR==1{print} NR==2{print; printf"\n";exit}' file
Run Code Online (Sandbox Code Playgroud)

这将记录分隔符设置为". 所以,我们要打印前两条记录,然后我们就完成了。更详细地:

  • -v RS='"'

    这将输入记录分隔符设置为双引号。

  • -v ORS='"'

    这将输出记录分隔符设置为双引号。

  • NR==1{print}

    这告诉 awk 打印第一行。

  • NR==2{print; printf"\n";exit}

    这告诉 awk 打印第二行,然后打印一个换行符,然后退出。

使用 sed

sed -r 'H;1h;$!d;x; s/(([^"]*"){2}).*/\1/' file
Run Code Online (Sandbox Code Playgroud)

这会立即读取整个文件。因此,如果文件很大,请不要使用这种方法。它的工作原理如下:

  • H;1h;$!d;x

    这是一个有用的 sed 习惯用法:它一次读取整个文件。

  • s/(([^"]*"){2}).*/\1/

    这将查找第二个",然后删除第二个引号之后的所有文本。

    正则表达式(([^"]*"){2})捕获直到并包括第二个双引号的所有文本并将其保存在组 1 中。正则表达式.*捕获到文件末尾的所有内容。替换文本是组 1, \1