줄 끝까지 정규식 뒤의 텍스트를 제거합니다.

줄 끝까지 정규식 뒤의 텍스트를 제거합니다.

이런 파일이 있어요

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

-ogrep옵션을 사용하면 일치하는 부분만 인쇄 됩니다 . 따라서 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

관련 정보