sed의 여러 패턴(정규식 AND 또는 조건부)

sed의 여러 패턴(정규식 AND 또는 조건부)

불필요한 데이터를 삭제하고 싶어요. 그래서 내 질문은 test1에 test1이 포함되어 있지 않은 경우 위 줄을 어떻게 제거할 수 있는가입니다.또는제안으로 끝나지 않나요?

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
**This is some unwanted data to remove**
20  /test1/type="Western"
20  /test1/end=category
**This is some unwanted data to remove**
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose

예상 출력:

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose

다음 몇 가지 명령이 붙어 있습니다.

1. grep -B1 'test1' test_long_sentence.txt
2. sed '/test1/!d' test_long_sentence.txt 
3. sed '/\"$/!d' test_long_sentence.txt

아니오를 결합하는 방법을 모르겠습니다. 2 및 3(sed에는 정규식 및 OR 조건이 포함된 여러 명령이 있음)

답변1

lex(또는 flexLinux 시스템의 경우)은 스캐너/렉서 사양을 가져와 이를 C 프로그램으로 변환하는 프로그램입니다. 스캐너 사양은 기본적으로 프로그램 사양과 유사 awk하지만 awk레코드 지향 버전 lex은 "문자 지향"입니다.

lex다음 소스와 함께 사용하세요 lexer.l.

%x OUTPUT
%%
                        int quoted = 0;

^[0-9]*[ \t]*"/test1/"  { BEGIN OUTPUT;             ECHO; }
<OUTPUT>\n              { if (!quoted) { BEGIN 0; } ECHO; }
<OUTPUT>[^\\]["]        { quoted = !quoted;         ECHO; }
<OUTPUT>.               {                           ECHO; }
.|\n                    ;

스캐너는 OUTPUT상태를 사용하여 현재 문자를 출력할지 여부를 추적합니다. BEGIN OUTPUT다음과 같은 줄을 찾으면 이 상태로 들어갑니다.

<number>  /test1/

(이것은 첫 번째 규칙에 의해 처리됩니다.) 줄이 끝나고 현재 인용된 문자열을 스캔하고 있지 않으면 이 상태를 종료합니다(이것은 두 번째 규칙에 의해 처리됩니다).

따옴표 붙은 문자열은 "이스케이프되지 않은 문자로 시작하고 끝납니다(세 번째 규칙). 다른 모든 문자는 있는 그대로 전달되므로 조치가 필요하지 않습니다(4번째 규칙).

상태가 아닐 때는 OUTPUT모든 것을 무시합니다(마지막 규칙).

이는 특정 데이터를 위해 작성된 임시 스캐너입니다. 이스케이프된 백슬래시( )로 끝나는 인용 문자열은 처리하지 않지만 "some data \\"표시되는 데이터에는 작동합니다.

빌드하세요:

$ make lexer
lex  -o lex.lexer.c lexer.l
cc -O2 -pipe    -o lexer lex.lexer.c  -ll
rm -f lex.lexer.c

(Linux에서는 를 사용할 때 를 flex사용해야 할 수도 있습니다 make lexer LDLIBS=-ll)

그걸 써:

$ ./lexer <file
20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create
a fun-filled moment"
20  /test1/end=Purpose

관련 정보