bash regex 从文件中查找并保存字符串

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

ter*_*don 7

首先,强制性警告。尝试使用正则表达式等简单工具解析 HTML通常是一个非常糟糕的主意。也就是说,在这种情况下,如果您确定您想要的始终是以 开头的行中的第二个单词Hello,您可以使用以下方法之一:

  1. GNU grep

    grep -oP '^Hello\s+\K\S+'
    
    Run Code Online (Sandbox Code Playgroud)

    这是grep与 Perl 兼容的正则表达式 ( -P) 并-o告诉它只打印该行的匹配部分。正则表达式本身先查找Hello,然后查找一个或多个空白字符 ( \s+),然后丢弃它 ( \K),然后查找1 个或多个非空白字符 ( \S+)。

  2. 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)


hee*_*ayl 4

如果你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 可能不是一个好主意。