각 줄의 형식은 다음과 같습니다. 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