![bash 正则表达式从文件中查找并保存字符串](https://linux22.com/image/80138/bash%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BE%E5%B9%B6%E4%BF%9D%E5%AD%98%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我的文件,hi.html
有很多行文本。我需要寻找以
Hello abc123 blah blah blah
然后保存到myvariable
任何文本,其位置abc123
会不时改变,但是Hello
硬编码的,并且始终是“Hello”。请注意,空格分隔了所有重要的文本两侧abc123
。
答案1
首先,强制性警告。通常是一个非常糟糕的主意尝试使用正则表达式等简单工具来解析 HTML。也就是说,在这种情况下,如果您确定您想要的始终是以 开头的行中的第二个单词Hello
,则可以使用以下之一:
GNU
grep
grep -oP '^Hello\s+\K\S+'
这是
grep
使用 Perl 兼容正则表达式 (-P
) 并-o
告诉它仅打印该行的匹配部分。正则表达式本身会查找Hello
,然后查找一个或多个空白字符 (\s+
),然后丢弃它 (\K
),然后查找 1 个或多个非空白字符 (\S+
)。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 可能不是一个好主意。