줄 시작 부분에서 여러 제외 제약 조건이 있는 문자열 찾기

줄 시작 부분에서 여러 제외 제약 조건이 있는 문자열 찾기

파일에서 모든 "큰따옴표" 문자열을 찾으려면 다음을 사용합니다.

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

GNU sed또는 호환 버전을 사용하세요.

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

관련 정보