因此,我需要在类似这样的字符串后面查找文本
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
忽略您不需要的所有内容以及-P
Pearl 正则表达式。我喜欢将其输入到 sort 中,以便更好地衡量
grep -oP '(?<=:)\w*' file.txt | sort