Linux

使用 grep 搜尋以非單詞字元開頭的單詞

  • June 20, 2019

文件 testing.txt 的內容是:

ls -a
cmake --verbose
verbose

我想用來grep瀏覽這個文件,只找到以“–”開頭的單詞,即單詞“–verbose”

但是,使用以下模式作為參數grep不起作用:

$ cat testing.txt | grep -- 
Usage: grep [OPTION]... PATTERN
  [FILE]... Try 'grep --help' for more information.

$ cat testing.txt | grep -
ls -a
cmake --verbose

$ cat testing.txt | grep '--v'
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

$ cat testing.txt | grep ver
cmake --verbose
verbose

$ cat testing.txt | grep '-ver'
ls -a
  • grep認為所有以 a 開頭的參數--都是選項?您如何防止這種情況發生,以便 grep 可以搜尋以“–”開頭的模式(在文件中)?
  • 最後一次嘗試使用模式“-ver”,因此grep不認為該模式是一個選項,但隨後grep與文件中的單詞“–verbose”不匹配,即使它包含模式“-ver”。是什麼導致了這種行為?

--當它出現在命令行上時,該字元串對於大多數實用程序來說都是特殊的。它向命令行參數解析器發出*選項結束的信號。*它用於您可能希望傳遞以破折號開頭的文件名的情況,例如rm -- -f(刪除-f在目前目錄中呼叫的文件)。

--與 一起用作模式grep,請明確告訴實用程序它是一個模式:

grep -e --

-e選項接受一個選項參數,該grep參數是您要grep搜尋的模式。

你也可以使用

grep -- --

在這裡,grep知道第二個--是模式,因為第一個--說它不能是一個選項。


您的最後一個管道返回ls -a,因為這是文件中不包含r. 該命令grep -ver也可以寫成grep -v -e r,即“提取所有不( -v)匹配r( -e r)的行”。

引用自:https://unix.stackexchange.com/questions/525919