在文件BASH中的其他两个字符串之间选择一个字符串

时间:2019-12-22 21:23:45

标签: bash awk sed grep

我知道有人问同样的问题,但我没有任何结果, 这是我的文字:

AttributeError: 'DataFrameGroupBy' object has no attribute 'quatile'

我想从中提取“ PeKPATbxnupBGgWTIg5B”。 我正在做<html> <head> <title>emdee five for life</title> </head> <body style="background-color:powderblue;"> <h1 align='center'>MD5 encrypt this string</h1><h3 align='center'>PeKPATbxnupBGgWTIg5B</h3><center><form action="" method="post"> <input type="text" name="hash" placeholder="MD5" align='center'></input> </br> <input type="submit" value="Submit"></input> </form></center> </body> </html> ,但它不返回任何内容。 请帮助我:(

2 个答案:

答案 0 :(得分:1)

正确的方法是使用XML / HTML解析器。

如果您的文字是

...
<h1 align='center'>MD5 encrypt this string</h1><h3 align='center'>PeKPATbxnupBGgWTIg5B
</h3><center><form action="" method="post">
...

然后

sed -n "/<h3 align='center'>/,/^<\/h3>/p" thefile

会返回

<h1 align='center'>MD5 encrypt this string</h1><h3 align='center'>PeKPATbxnupBGgWTIg5B
</h3><center><form action="" method="post">

这不是您想要的。格式/<start>/,/<end>/<start><end>之间的所有行都匹配。

您可以使用带有反向引用的替换来匹配所需的字符串,例如

sed -n "s/.*<h3 align='center'>\(.*\)<\/h3>.*/\1/p" thefile

返回

PeKPATbxnupBGgWTIg5B

使用支持Perl兼容正则表达式(PCRE)的grep,您可以使用

grep -P -o "<h3 align='center'>\K.*(?=</h3>)" thefile
  • -P启用与perl兼容的正则表达式
  • -o仅打印匹配的部分
  • <h3 align='center'>\K使用正向后缀,\K用于匹配<h3 align='center'>,但不包含在匹配项中
  • .*匹配任何字符
  • (?=</h3>)使用正向先行匹配不匹配的</h3>

答案 1 :(得分:0)

sed命令sed -n '/pattern1/,/pattern2/p 确实用于提取 在pattern1pattern2之间的行(包括如果 位于单独的行中。
例如,以下测试代码:

cat <<EOS | sed -n '/pattern1/,/pattern2/p'
foo
bar
pattern1
These lines
are printed.
pattern2
baz
EOS

输出:

pattern1
These lines
are printed.
pattern2

但是,如果模式为,则上面的sed命令起作用 位于同一行。 此外,插入符号^和美元符号$匹配开始 和行尾。他们没有指出职位 匹配的子字符串。

请改用以下方法:
(不用说我不打算用sed来解析XML文件。这 只是使用sed提取子字符串的案例研究。)

sed -n "s/.*h3 align='center'>\([^<]*\)<\/h3.*/\1/p" thefile

模式.*h3 align='center'>\([^<]*\)<\/h3.*与以下项匹配:

  • 包含h3 align='center'和任何前面的子字符串 字符返回到字符串的开头。
  • 其后是一系列除<之外的任何字符。
  • 后跟一个包含</h3和任何结尾的子字符串 直到行尾的字符。

然后,s(替代)命令将匹配的模式替换为 上面的第二个子字符串。用于extract第二个子字符串 从匹配的行开始。

让我详细介绍第二个专利\([^<]*\)

  • 字符类[^<]<之外的任何字符都匹配。
  • 概念other than <是锚定模式匹配所必需的 就在以下子字符串</h3之前。否则匹配 由于以下原因,可能会在下一个子字符串</h3上运行 greedy match
  • 星号*是用于确定重复次数的量词 前一个原子。在这种情况下,它与子字符串的匹配时间更长 由<以外的任何字符组成的大于0的数字。
  • 周围的括号\(\)创建capture group,然后 包围的子字符串可以用\n引用(其中n是一个数字 按外观顺序)替换。

希望这会有所帮助。