删除两组字符之间的所有文本

时间:2019-06-04 07:39:01

标签: shell sh

我有一个文本文件,其中包含数百行。我想删除/* =中的每一行。这是一个示例:

/* Class = "UIButton"; normalTitle = "GET SUPPORT"; ObjectID = "2SP-lc-CRF"; */
"2SP-lc-CRF.normalTitle" = "GET SUPPORT";

/* Class = "UIButton"; normalTitle = "TAKE PHOTO"; ObjectID = "4Dp-dN-aZh"; */
"4Dp-dN-aZh.normalTitle" = "TAKE PHOTO";

/* Class = "UIButton"; normalTitle = "WHATSAPP"; ObjectID = "4J2-uX-p15"; */
"4J2-uX-p15.normalTitle" = "WHATSAPP";

所以我剩下的就是:

"GET SUPPORT";
"TAKE PHOTO";
"WHATSAPP";

我是一个shell脚本菜鸟,所以我没有太多的文本处理经验。我知道一些基本命令。这是我到目前为止的内容:

#!/bin/bash
sed 's//*.**/://' Test > RESULT.txt

它似乎不起作用。我最后遇到一个错误:

 sed: 1: "s//*.**/://": bad flag in substitute command: ':'

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用此sed删除所有/* ... */行:

sed '/\/\*.*\*\//d; s/^.*= *//' Test > RESULT.txt
cat RESULT.txt

"GET SUPPORT";

"TAKE PHOTO";

"WHATSAPP"; 
  • 请注意,/*字符都是特殊的正则表达式元字符,需要转义。
  • /d命令删除给定模式的行。
  • s/^.*= *//命令删除文本,直到每次删除都=<space>为止。

答案 1 :(得分:0)

除了sed,您还可以awk达到相同的效果,例如

$ awk -F' = ' '/\/\*.*\*\/$/{next} /^$/{next} {print $2}' file
"GET SUPPORT";
"TAKE PHOTO";
"WHATSAPP";

本质上,它们使用相同的正则表达式来跳过包含注释的行或使用next的空行,仅打印未跳过的行的第二个字段。