用斜线匹配后 grep 文本

用斜线匹配后 grep 文本

因此,我需要在类似这样的字符串后面查找文本

Motherboard P/N           :   XXXXXXXXXX

XXXXXXXXX我想要的文本在哪里?我不想要Motherboard P/N :

我似乎无法让 awk、cut、sed 或其他任何东西与 P/N 很好地配合使用

有任何想法吗?

答案1

grep -oP 'Motherboard P/N           :   \K.*'

解释:

  • -o仅打印行的匹配部分
  • -P使用与 Perl 兼容的正则表达式 (PCRE) - 这可以启用更高级的正则表达式功能
  • \K不要将上述内容视为比赛的一部分。
  • .*匹配零个或多个任意字符(换行符除外)

答案2

为什么不按照以下方式使用 grep 和 sed 的管道机制:

grep "Motherboard P/N" souceFile | sed 's/^.*Motherboard\ P\/N\ \:\ //1'

其中 sourceFile 是包含文本的文件。Sed 具有以下正则表达式:

  • ^.*意思是:从行首开始,直到任意数量的字符

  • Motherboard包含更多字符的字符串,需要注释(如下)

  • \特殊字符前面的字符会“转义”它们,因此它们不会被 shell 或命令解释,而是被用作普通字符:空格、斜杠和冒号。

或者您可以通过管道传输命令的输出(例如,useful sudo lshw

sudo lshw | grep "Motherboard P/N" | sed 's/^.*Motherboard\ P\/N\ \:\ //1'

但是,您很可能不会在 lshw 的输出中找到“主板 P/N:”文本,并且此示例的输出可能为空……

编辑:

或者,正如我从您的评论中看到的那样,您可以稍微修改正则表达式,以同时适应“S/N”和“P/N”。使用点.代替源文本行之间不同的字符。例如:

sed 's/^.*Motherboard\ P\/N\ \:\ //1'  # the initial version
sed 's/^.*Motherboard\ .\/N\ \:\ //1'  # dot instead of "P"

...同样如此grep

答案3

只需使用 grep 进行回顾:

grep -argument '(?<=string_you_use_as_separator)what_you_are_looking_for' dir/file_to_be_grepd.txt

在这种情况下,正则表达式将如下所示:

(?<=:)\w*

完整的 grep 命令。用于-o忽略您不需要的所有内容以及-PPearl 正则表达式。我喜欢将其输入到 sort 中,以便更好地衡量

grep -oP '(?<=:)\w*' file.txt | sort

相关内容