我有一个 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
。
-o
仅打印匹配项,而不是整行。-P
用途聚合酶链反应, 哪个支持\K
删除迄今为止匹配的文本,因此它不会包含在返回的匹配文本中。-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
,但这就是sed
Ubuntu 中提供的实现。
如果第一行匹配项包含多个匹配项,这种sed
方法可以让你最后一个.从MOM:MANIKA MOM:JANE"></td><br>
你得到:
JANE