使用 bash 脚本从 HTML 文件中提取给定字符串后的特定字符串

使用 bash 脚本从 HTML 文件中提取给定字符串后的特定字符串

我有一个 HTML 文件momcpy.html,我想从中取出给定字符串后的特定字符串。文件内容如下:

<tr><br>
<th height="12" bgcolor="#808080"><label for="<br>
 LSCRM:Abhijeet<br>
 <br>
 MCRM:Bhargav<br>
 <br>
 TLGAPI:GAURAVAURAV<br>
 <br>
 MOM:MANIKA"></td><br>

这出现在 HTML 的其中一行中。

我想提取它Manika并将其存储在一个变量中。所以基本上我想提取后面的任何字符串妈妈:,它可能是动态的。

我努力了:

file='/home/websphe/tomcat/webapps/MOM/web/momcpy.html'
  y=$( awk '$1=="MOM:"{print $2}' $file)
 echo "$y"

但那没有用。

答案1

我不建议这样做,因为使用正则表达式解析 html 不太可能会有好结果但你也许能够得到MANIKA字符串

sed -nr '/MOM:/ s/.*MOM:([^"]+).*/\1/p' file

无论如何,它在您的样本上运行良好......

笔记

  • -n在我们要求之前不要打印任何内容
  • -r使用 ERE
  • /string/查找行string
  • s/old/new/old用。。。来代替new
  • .*任意数量的任意字符
  • ([^"]+)保存一些不存在的字符"
  • \1反向引用已保存的字符
  • p只打印我们更改的行

答案2

grep -Po 'MOM:\K[^"]+' file.html

警告:这不是一个非常强大的解决方案;并且您的 HTML 无效

答案3

您要查找的字符串MOM:前面总是有,但您没有说明它"后面是否总是有。为了回答这个问题,我假设您要查找允许包含任何大小写字母、数字或下划线的字符串。这些被称为单词字符用术语来说常用表达。匹配这样的文本“单词”非常有用,大多数正则表达式的方言都具有帮助实现此目的的功能。如果这不是您想要的,您可以相应地修改此解决方案,或者您可以使用其他答案中的技术。

我赞同大卫·福斯特的扎娜的, 和JJoao 的关于使用正则表达式解析 HTML 以及这不够强大的明智警告。请小心,并考虑您所请求的是否确实是您想要执行的操作。在您的示例代码中,您将输入文件的路径分配给变量$file,因此我假设这已完成。您已将命令的输出分配给$y,因此我将执行相同的操作。

grep

这类似于JJoao 的方法,如果那里的正则表达式更适合您的需要,您也可以使用该方法进行命令替换。

y="$(grep -oPm1 'MOM:\K\w+' "$file")"

-oPm1只是一种更紧凑的书写方式-o -P -m 1

请注意,您还可以-m1在命令中添加JJoao 的回答所以它只使用第一行有匹配项的匹配项。

如果第一行匹配项包含多个匹配项,这种grep方法可以让你他们全部。例如,如果该行是,MOM:MANIKA MOM:JANE"></td><br>则将$y保存以下值:

MANIKA
JANE

sed

这类似于扎娜的方法

y="$(sed -rn '0,/.*MOM:(\w+).*/ s//\1/p' "$file")"

除了作为命令替换之外,区别在于:

  • 在第一行包含匹​​配项后停止
  • 匹配一个或多个单词字符 ( \w+),而不是最多一个字符"( [^"]+)
  • 首先使用零个或多个任意字符 ( .*),因此MOM:不必出现在行的最开头
  • 使用更紧凑的语法,避免两次编写模式。

我使用的技术需要GNUsed,但这就是sedUbuntu 中提供的实现。

如果第一行匹配项包含多个匹配项,这种sed方法可以让你最后一个.从MOM:MANIKA MOM:JANE"></td><br>你得到:

JANE

相关内容