tes*_*now 7 text-processing regular-expression
我的文件 ,hi.html有很多行文本。我需要追捕以
Hello abc123 blah blah blah
Run Code Online (Sandbox Code Playgroud)
然后保存到myvariable任何文本所在的位置,abc123它的位置会不时改变,但是Hello是硬编码的,并且永远是“你好”。请注意,空格分隔由 all important 占据的文本的两侧abc123。
首先,强制性警告。尝试使用正则表达式等简单工具解析 HTML通常是一个非常糟糕的主意。也就是说,在这种情况下,如果您确定您想要的始终是以 开头的行中的第二个单词Hello,您可以使用以下方法之一:
GNU grep
grep -oP '^Hello\s+\K\S+'
Run Code Online (Sandbox Code Playgroud)
这是grep与 Perl 兼容的正则表达式 ( -P) 并-o告诉它只打印该行的匹配部分。正则表达式本身先查找Hello,然后查找一个或多个空白字符 ( \s+),然后丢弃它 ( \K),然后查找1 个或多个非空白字符 ( \S+)。
awk
awk '$1=="Hello"{print $2}' file
Run Code Online (Sandbox Code Playgroud)
awk将自动在空白处拆分其输入行,第一个字段将是$1,第二个$2等。因此,如果第一个字段是 ,此脚本将打印第二个字段Hello。请注意,它不会匹配Helooo。如果您想要第一个字符是的所有行,Hello而不必只是第一个单词恰好是 的行Hello,请改用:
awk '/^Hello/{print $2}' file
Run Code Online (Sandbox Code Playgroud)使用这两种方法,要将输出保存在变量中,请使用命令替换:
myvariable=$(grep -oP '^Hello\s+\K\S+')
myvariable=$(awk '/^Hello/{print $2}' file)
Run Code Online (Sandbox Code Playgroud)
如果你grep支持PCRE,你可以这样做:
grep -Po '^Hello \K[^ ]+(?= )' hi.html
Run Code Online (Sandbox Code Playgroud)
要将其保存在变量中:
myvariable="$(grep -Po '^Hello \K[^ ]+(?= )' hi.html)"
Run Code Online (Sandbox Code Playgroud)
替代sed方式:
sed -n 's/^Hello \([^ ]\+\) .*/\1/p' hi.html
Run Code Online (Sandbox Code Playgroud)
要将其保存在myvariable:
myvariable="$(sed -n 's/^Hello \([^ ]\+\) .*/\1/p' hi.html)"
Run Code Online (Sandbox Code Playgroud)
请注意,使用正则表达式解析 html 可能不是一个好主意。