bash 正则表达式从文件中查找并保存字符串

bash 正则表达式从文件中查找并保存字符串

我的文件,hi.html有很多行文本。我需要寻找以

Hello abc123 blah blah blah

然后保存到myvariable任何文本,其位置abc123会不时改变,但是Hello硬编码的,并且始终是“Hello”。请注意,空格分隔了所有重要的文本两侧abc123

答案1

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

  1. GNUgrep

    grep -oP '^Hello\s+\K\S+'
    

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

  2. awk

    awk '$1=="Hello"{print $2}' file
    

    awk将自动在空格上分割其输入行,第一个字段将为$1,第二个字段$2等。因此,如果第一个字段为 ,则此脚本将打印第二个字段Hello。请注意,它不会匹配Helooo。如果你想要所有第一个行人物Hello并且不一定只是那些第一个单词恰好是 的人Hello,请改用:

    awk '/^Hello/{print $2}' file
    

对于这两种方法,要将输出保存在变量中,请使用命令替换:

myvariable=$(grep -oP '^Hello\s+\K\S+')
myvariable=$(awk '/^Hello/{print $2}' file)

答案2

如果你grep支持PCRE,你可以这样做:

grep -Po '^Hello \K[^ ]+(?= )' hi.html

要将其保存在变量中:

myvariable="$(grep -Po '^Hello \K[^ ]+(?= )' hi.html)"

替代sed方式:

sed -n 's/^Hello \([^ ]\+\) .*/\1/p' hi.html

要将其保存在myvariable

myvariable="$(sed -n 's/^Hello \([^ ]\+\) .*/\1/p' hi.html)"

请注意,使用正则表达式解析 html 可能不是一个好主意。

相关内容