입력하다:
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 }
의미: 위와 일치하지 않으면 다른 모든 줄에 대해(즉, 줄의 시작 부분과 일치하므로 빈 줄도 일치함) 해당 줄을 인쇄하면 됩니다.