이런 파일이 있어요
this is a year (2004); this text is not insteresting
singer elton john; month and year (December, 2005); blah blah
this another year (2007); irrelevant text
나는 연도 직후에 선을 자르고 싶습니다);
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
이건 작동하지 않아
sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file
sed나 awk로 어떻게 할 수 있나요?
답변1
원하는 것을 작성하는 유효한 방법은 다음과 같습니다.
sed -E 's/(.*[0-9]{4}\);).*/\1/' file
yyyy);
이렇게 하면 각 줄의 마지막 항목 이후의 모든 줄 문자가 삭제됩니다 .
귀하의 시도는 다음과 같습니다
sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file
-E
그러나 확장 정규식을 활성화하는 플래그 때문에 \( \)
일치하는 그룹을 구분하지 말고 대신 파일의 리터럴 괄호와 일치하고 ( )
일치하는 그룹을 구분합니다. 따라서 괄호는 [0-9]{4})
일치하지 않으며 sed는 다음과 같이 불평합니다.
sed: -e expression #1, char 28: Unmatched ) or \)
답변2
항상 하나만 있는 경우 );
매우 간단합니다.
$ sed 's/);.*/);/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
더 많은 것이 있을 수 있고 마지막 것 이후의 모든 것을 제거하려는 경우:
$ sed -E 's/(.*)\);.*/\1);/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
)
4개의 숫자( )가 뒤에 오는 것을 일치시키려고 했으나 \)[0-9]{4}
입력에 해당 항목이 없기 때문에 작동하지 않습니다. 나는 당신이 다음과 같은 것을 쓰려고했다고 생각합니다 :
$ sed -E 's/(.*[0-9]{4}\);).*/\1/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
답변3
사용 grep
(지원하는 버전이 -o
옵션이라고 가정)
$ grep -oE '.*[0-9]{4});' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
-o
grep
옵션을 사용하면 일치하는 부분만 인쇄 됩니다 . 따라서 sed
이 패턴을 포함하지 않는 줄은 인쇄되지 않으므로 명령 과 완전히 동일하지 않습니다 .
답변4
귀하의 예에서는 마지막 ;
. 이는 sed
역참조가 필요하지 않은 간단한 작업입니다 .
$ sed 's/;[^;]*$/;/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
또는 다음을 사용하여 awk
:
awk -F ';' 'BEGIN { OFS=FS } { $NF=""; print }' file