이 특정한 경우에 "sed" 명령을 올바르게 사용하는 방법

이 특정한 경우에 "sed" 명령을 올바르게 사용하는 방법

각 줄의 형식은 다음과 같습니다. names.txt 파일이 있습니다.

xxxxxx   random_string_of_characters    2015

xxxxxx가 6자리 숫자인 경우, random_string_of_characters는 다음과 같습니다.아무것. 각 문자열이 다음과 같이 보이도록 각 줄에서 xxxxxx와 2015 사이의 모든 공백과 random_string_of_characters를 바꾸기 위해 바꾸기 명령을 사용하고 싶습니다.

xxxxxx 2015

그렇다면 이것을 달성하는 가장 좋은 방법은 무엇입니까?

답변1

넌 할 수있어

sed -i -e 's/[[:space:]]\+.\+2015$/ 2015/' names.txt

같은 파일에 저장하고 싶다면. -i표준 출력으로만 인쇄하려면 표준 출력을 제거하고 다른 파일로 리디렉션할 수 있습니다.

줄 끝의 공백 수와 일치하고 그 뒤에 2015년 이전의 공백이 오는 경우 전체 일치 항목을 "2015"로 바꿉니다.

또 다른 가능성은 다음과 같습니다

sed -e 's/^\([[:digit:]]\{6\}\).\+\([[:digit:]]\{4\}\)$/\1 \2/'  names.txt

줄 시작 부분의 6개 숫자와 줄 끝 부분의 4개 숫자를 일치시키고 그 사이에 공백을 두고 일치하는 항목을 인쇄합니다. 다른 행은 변경되지 않은 상태로 유지됩니다.

답변2

내가 선호하는 것은 역추적을 줄이기 위해 문자열의 시작 부분에 고정하는 것입니다. 확장 정규식을 좋아하므로 다음을 사용합니다.

sed -re 's/^([0-9]{6}) .*( 2015)$/\1\2/' names.txt

이것은 무엇을 위한 것인가?

-r extended regexp
-e expression to follow
s substitute
^ beginning of line
( start subpattern
[0-9] a digit
{6} previous occurs exactly six times
) end subexpression
. any single character
* previous occurs zero or more times
$ end of line
\1 first subpattern
\2 second subpattern

관련 정보