Sed는 패턴을 일치시킨 후 텍스트를 추가합니다.

Sed는 패턴을 일치시킨 후 텍스트를 추가합니다.

패턴이 있어요

62G   57G  52% 

나는 그것들을 별도의 행에 넣고 싶습니다.
첫 번째 일치 G Free 이후,
두 번째 Used 이후
, 세 번째 Utilized 이후

그래서 다음과 같아야합니다

62G Free 
57G Used  
52% Utilised 

답변1

데이터가 라는 파일에 있다고 가정하면 file다음 명령은 해당 파일의 각 줄을 읽고 지정한 형식으로 세 개의 열을 출력합니다.

$ awk '{ printf("%s Free\n%s Used\n%s Utilised\n", $1, $2, $3) }' file
62G Free
57G Used
52% Utilised

각 입력 줄에 대해 코드의 블록이 실행됩니다. 블록에는 printf()공백으로 구분된 세 개의 열을 세 개의 행으로 형식화하고 텍스트를 추가하는 명령문이 포함되어 있습니다.

그렇게 하는 것이 불가능하지는 않지만 sed불필요하게 어렵습니다.

$ sed -e 's/[[:blank:]][[:blank:]]*/:/g' -e 's/:/ Free@/' -e 's/:/ Used@/' -e 's/%/% Utilised/' -e 'y/@/\n/' file
62G Free
57G Used
52% Utilised

먼저 모든 공백 문자를 단일 문자로 압축한 다음 :이러한 문자를 하나씩 바꿔서 원하는 추가 텍스트 문자열을 삽입합니다. 삽입할 때 나중에 줄 바꿈을 삽입하려는 문자 :도 추가합니다. @마지막 단계로 삽입된 모든 @문자를 개행 문자로 변경합니다.

명령 의 대체 부분에 사용할 sed수 있는 GNU를 사용하면 명령을 더 짧게 만들 수 있습니다.\ns///

$ gsed -E -e 's/[[:blank:]]+/:/g' -e 's/:/ Free\n/' -e 's/:/ Used\n/' -e 's/%/% Utilised/' file
62G Free
57G Used
52% Utilised

두 솔루션 모두 문자열에서 및 임시 "자리 표시자 문자"로 sed사용할 수 있으며 이러한 문자는 문자열의 다른 곳에 나타나지 않는다는 사실에 의존합니다 .:@

관련 정보