行の先頭で複数の除外制約を持つ文字列を検索する

行の先頭で複数の除外制約を持つ文字列を検索する

ファイル内のすべての「二重引用符」文字列を見つけるには、次のようにします。

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または、以下を使用してこれを実行できますawk

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

関連情報