Sed 정규식 - 원시 일치 항목 포함

Sed 정규식 - 원시 일치 항목 포함

입력하다:

dsfgsdf8gfsd
2011.06.26. v
iudsfg98sdfg
sosdufgsdfg
2011.06.27. h
8xdofguiosdfg
jdasfhasd89fa
2011.06.28. k
ydsfgsdgsdg
dsfgdsfzfszgh
2011.06.29. sze
ds9fgisdfgsdfg
asdfasdfasddf
2011.06.30. cs
dsg789sdiofgsdg
dsfig89dsfgds
2011.07.01. p
sd9fg8sdgsdg
sdlfjgsd89öfgxcbv
dsglsd9gcxbv
dsflgjsdlfgfsdg
sdfsdfgdxfgxc
2011.07.02. szo
cvbdsgfsd
2011.07.03. v
dfgsdfgsd
2011.07.04. h
sdfgsdfgsdg

예를 들어 sed를 사용하여 이 출력을 어떻게 얻을 수 있습니까? (또는 펄?)

2011.06.26. v
iudsfg98sdfg
sosdufgsdfg
----------
2011.06.27. h
8xdofguiosdfg
jdasfhasd89fa
----------
2011.06.28. k
ydsfgsdgsdg
dsfgdsfzfszgh
----------
2011.06.29. sze
ds9fgisdfgsdfg
asdfasdfasddf
----------
2011.06.30. cs
dsg789sdiofgsdg
dsfig89dsfgds
----------
2011.07.01. p
sd9fg8sdgsdg
sdlfjgsd89öfgxcbv
dsglsd9gcxbv
dsflgjsdlfgfsdg
sdfsdfgdxfgxc
----------
2011.07.02. szo
cvbdsgfsd
----------
2011.07.03. v
dfgsdfgsd
----------
2011.07.04. h
sdfgsdfgsdg

그래서 나는 바꾸고 싶습니다 :

2011.06.26. v

그리고

2011.06.27. h

등:

----------
2011.06.26. v

그리고

----------
2011.06.27. h

나는 이것을 시도했습니다 (웃지 마세요 :D):

sed "s/[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\. /WTF/g"

하지만 sed에서 "h, k, sze, cs, p, szo, v"를 일치시키는 방법이나 일치하는 내용을 "WTF"(in.../WTF/g")에 넣는 방법을 모르겠습니다.

누구든지 어떤 아이디어가 있습니까? :\

감사합니다!

답변1

시작점은 다음 sed 라인입니다:

$ echo 2011.06.26. v | sed 's/^\([0-9]\+\.[0-9]\+\.[0-9]\+\. \([hv]\|sze\)\)$/----------\n\1/'
----------
2011.06.26. v

()|+sed는 기본 정규식 구문(기본적으로)을 사용하므로 특수한 의미(그룹화, 대체, 하나 이상)를 얻으려면 문자를 이스케이프해야 합니다 . \1첫 번째 그룹 경기에 대한 참조를 다시 참조 하세요 .

답변2

다음을 사용하여 이 솔루션을 찾았습니다 sed.

sed -n '/^[0-9]\{4\}\.[01][0-9]\.[0123][0-9]\./,${:a;N;$!ba;{s/\([0-9]\{4\}\.[01][0-9]\.[0123][0-9]\.\)/--------------\n\1/g;p}}'

단점은 날짜가 두 번 일치해야 한다는 것입니다. 어쩌면 또 다른 (더 나은) 해결책이 있을 수도 있습니다.
출력은 예제에서 예상한 것과 정확히 같습니다.

답변3

즉, ----------각 행 앞에 YYYY.MM.DD 날짜를 삽입하고 그 뒤에 공백과 여러 개의 소문자를 삽입하려고 합니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 삽입 명령( )을 사용할 수 있습니다 i.

sed -e '/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/ i \
----------'

또는 줄 시작 부분의 빈 문자열을 개행 문자로 바꿀 수 있습니다.

sed -e '/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/ s/^/----------\
'

또는 일치하는 패턴을 나타내기 위해 &명령의 대체 텍스트에 이를 사용할 수 있습니다.s

sed -e 's/^[0-9][0-9][0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] [a-z][a-z]*$/----------\
&'

일부 sed구현에서는 대체 텍스트에 백슬래시 대신 개행 문자를 쓸 수 있지만 \n다른 구현 \n에서는 \n또는 n.

답변4

대신 awk를 사용해야 합니다

awk ' /[0-9]{4}\.[0-9]{2}\.[0-9]{2}\. / { print "---------------------\n" $0 ; continue } /^/ { print $0 } ' <"INPUTFILE" >"OUTPUTFILE"

기본적으로 두 단계로 작동합니다.

1 단계:/[0-9]{4}\.[0-9]{2}\.[0-9]{2}\. / { print "---------------------\n" $0 ; continue }

의미: /4digits.2digits.2digits와 일치하는 경우. / 그런 다음 "---...--\n"과 일치하는 줄을 인쇄하고 다음 줄에서 반복합니다(="continue").

2 단계:/^/ { print $0 }

의미: 위와 일치하지 않으면 다른 모든 줄에 대해(즉, 줄의 시작 부분과 일치하므로 빈 줄도 일치함) 해당 줄을 인쇄하면 됩니다.

관련 정보