grep如何使用行首和行尾

How does grep uses beginning and ending of lines

我想阅读 gcc 的手册页中的一个选项。所以我做了 man gcc | grep -- '^-c'。错误是 troff - cant break line,因为我的屏幕一半是终端。但是我通过 MANWIDTH=1000 man gcc | grep -- '^-c' 的声明修复了这个问题(感谢:。但不幸的是它不会找到那个选项。没有 begginig 模式(那只是 -c :完整:MANWIDTH=1000 man gcc | grep -- '-c',它会找到所有出现的-c,这被淘汰了很多,但特别是我正在寻找的选项会被无用的搜索搞得一团糟。所以为什么grep不使用^$ 作为线的开始和结束?或者它与我的终端大小有关 window (即按宽度缩短)= 线的锚点? 然后如何在不全屏显示终端的情况下使用 grep 通过行首进行搜索?

PS: 我不知道为什么,当我声明 MANWIDTH var 时,它不会立即应用于 man 命令,尽管它很有价值。也就是说,如果我先声明它,然后尝试 man 一些东西(最终通过管道将其传递给 grep 以进行行搜索),错误再次出现:troff: warning: can't break line

像这样:

MANWIDTH=1000;
echo $MANWIDTH #output 1000
man gcc | grep -- '^-c'
troff: <standard input>:10635: warning [p 97, 19.0i]: can't break line

-c 不在行首,因为它不在左边距。您可以使用模式 ^\s*-c,它允许在行首和 -c 之间有零个或多个空白字符。

但是如果你想阅读 -c 命令的文档,你最好使用 info 命令,至少在这种情况下:

info gcc --index-search=c

注意:要使其正常工作,您需要安装 gcc 信息页。例如,在 Debian/Ubuntu 系统上,您需要 sudo apt-install gcc-doc.

注意:gcc 信息文件作者选择不在大多数选项的索引条目中放置前导连字符。但是大多数信息文件都遵循使用破折号和破折号进行索引的约定(就像 gcc 使用一些 -f 选项一样)。尽管 info 会尝试找到最相关的索引匹配,但 info 索引搜索是文字字符串的子字符串匹配(即没有正则表达式运算符),有时您更喜欢使用破折号进行搜索:

info grep --index-search=-E

或使用 -all 选项提供所有匹配索引条目的列表:

info grep --all --index-search=E

对于选项比 gcc 少的实用程序,您可以直接转到带有 -O 选项的选项列表。

info grep -O

最后,回答你的PS:

如果您希望 MANWIDTH 成为对所有子进程可见的环境变量,请使用 export MANWIDTH=1000