查找行首有多个排除约束的字符串

查找行首有多个排除约束的字符串

如果我想查找文件中的所有“双引号”字符串,我会使用:

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

您可以使用sedorawk来实现:

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");

相关内容