如果我想查找文件中的所有“双引号”字符串,我会使用:
grep -rnw . -e "\".*\""
但我想排除所有以某些文本开头的行。例如:
#include
Serial.
例如,给定这些行:
#include "patterns.h"
#include "network.h"
Serial.println("clear");
Serial.println("set wifi");
#include "patterns.h"
#include "common.h"
Serial.printf("[LED] Init segment #%u with size %u\r\n", i + 1, len);
password = "xxxxxx";
ESPAsync_wifiManager.setCredentials(WM_config.WiFi_Creds.wifi_ssid, WM_config.WiFi_Creds.wifi_pw, "", "");
ESPAsync_wifiManager.setCORSHeader("Your Access-Control-Allow-Origin");
Serial.print(F("Starting configuration portal @ "));
Serial.print(F("192.168.4.1"));
命令只应列出这些grep
:
password = "xxxxxx";
ESPAsync_wifiManager.setCredentials(WM_config.WiFi_Creds.wifi_ssid, WM_config.WiFi_Creds.wifi_pw, "", "");
ESPAsync_wifiManager.setCORSHeader("Your Access-Control-Allow-Origin");
答案1
使用 PCRE,它们支持负向预测:
grep -Pe '^(?!Serial|#).*".*"'
^
是一行的开头;(?!...)
是负向前瞻,即这里的意思是该行不以Serial
或开头#
答案2
您可以使用sed
orawk
来实现:
sed '/^#/d; /^Serial\./d; /".*"/!d' < your-file
awk '! /^(Serial\.|#)/ && /".*"/' < your-file
这些返回至少包含两个"
字符且不以Serial.
或开头的行#
。
请注意,它们还返回诸如以下的行:
Serial.whatever("Serial. not at the beginning");
foo(); // some "comment"
/* and "some"
"other" comment */
bar('"', '"');
答案3
另一种方法是使用-v
( --invert-match
) 标志,用于排除您需要的行不想要,并将 grep 命令连接在一起:
grep -v "^#include" | grep -v "^Serial\." | grep -rnw . -e "\".*\""
答案4
使用 GNUsed
或兼容版本:
$ sed -En '/^(#|Serial)/!{/".*"/p}' input_file
password = "xxxxxx";
ESPAsync_wifiManager.setCredentials(WM_config.WiFi_Creds.wifi_ssid, WM_config.WiFi_Creds.wifi_pw, "", "");
ESPAsync_wifiManager.setCORSHeader("Your Access-Control-Allow-Origin");